```c
#include <bits/stdc++.h>
using namespace std;
int main(){
int n,m;
cin >> n >> m;
char a[n+1][m+1];
for(int i = 1;i <= n;++i){
for(int j = 1;j <= m;++j){
cin >> a[i][j];
}
}
int s = n * n;
int cnt = 0;
for(int i = 1;i <= n;++i){
for(int j = 1;j <= m;++j){
int x = i,y = j;
if(a[i][j] == 'o'){
cnt++;
}else{
int b = 0;
bool f = false;
while(1){
if(a[x][y] == 'u'){
x -= 1;
}else if(a[x][y] == 'd'){
x += 1;
}else if(a[x][y] == 'l'){
y -= 1;
}else if(a[x][y] == 'r'){
y += 1;
}
if(a[x][y] == 'o'){
cnt++;
break;
}
b++;
if(b == s){
break;
}
}
}
}
}
cout << cnt;
return 0;
}
```
by lucas_777 @ 2023-06-19 22:07:35
@[lucas_777](/user/728949) 你这必然TLE呀
by too_simple @ 2023-06-20 06:34:03
是不是问题应该出在不一定经过一堆if判断后又回到无风点才可以 ~~(本蒟蒻觉得大佬你的思路应该有点问题)~~
by poppingW @ 2023-06-20 09:32:54
栓Q
by lucas_777 @ 2023-06-20 17:55:21
@[lucas_777](/user/728949) 可以记录判断中得到的点,要么全都可以,要么全都不可以
by wyhm @ 2023-06-20 22:20:50
代码改完就过了
```cpp
#include <bits/stdc++.h>
using namespace std;
int p[1501][1501],c[1501][1501],qx[2000001],qy[2000001],ans,n,m;
char a[1501][1501];
int main(){
cin >> n >> m;
for(int i = 1;i <= n;++i){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
for(int i = 1;i <= n;++i){
for(int j = 1;j <= m;++j){
int x = i,y = j,cnt=0,add=0;
while(1){
c[x][y]++;
qx[++cnt]=x;
qy[cnt]=y;
if(a[x][y] == 'o'||p[x][y]==1){
add=1;
}
else if(x==0||y==0||x>n||y>m||p[x][y]==-1||c[x][y]>2){
add=-1;
}
if(add!=0){
for(int k=1;k<=cnt;k++){
p[qx[k]][qy[k]]=add;
c[qx[k]][qy[k]]+=add;
}
ans+=(add==1);
break;
}
if(a[x][y] == 'u'){
x -= 1;
}else if(a[x][y] == 'd'){
x += 1;
}else if(a[x][y] == 'l'){
y -= 1;
}else if(a[x][y] == 'r'){
y += 1;
}
}
}
}
cout << ans;
return 0;
}
```
by wyhm @ 2023-06-20 22:21:33
谢谢
by lucas_777 @ 2023-06-21 16:19:21