求助3wa,2TLE,50分

P1596 [USACO10OCT] Lake Counting S

要做标记,加个vis
by _Clown__ @ 2023-08-21 09:48:00


@[ng_bf](/user/593499) 还是不对啊 ``` #include<bits/stdc++.h> using namespace std; int w,h,sum,dx[8]={-1,-1,0,1,1,1,0,-1},dy[8]={0,-1,-1,-1,0,1,1,1}; char a[101][101]; int v[101][101]; void fun(int x,int y) { for(int i=0;i<8;i++) { int xx=x+dx[i]; int yy=y+dy[i]; if(xx>=1&&xx<=w&&yy>=1&&yy<=h&&a[xx][yy]!='.'&&a[xx][yy]=='W'&&v[xx][yy]==0) { a[xx][yy]='.'; v[xx][yy]=1; fun(xx,yy); } } } int main() { scanf("%d%d",&w,&h); for(int i=1;i<=w;i++) { scanf(" %s",&a[i]+1); } for(int i=1;i<=w;i++) { for(int j=1;j<=h;j++) { if(a[i][j]=='W') { a[i][j]='.'; fun(i,j); sum++; } } } printf("%d\n",sum); return 0; } ```
by DKsniper @ 2023-08-21 11:50:20


```cpp #include<bits/stdc++.h> using namespace std; int n,dx[8]={-1,1,0,0,1,1,-1,-1},dy[8]={0,0,-1,1,1,-1,1,-1},vis[101][101],m,ans,tx,ty; char a[101][101]; void dfs(int x,int y){ vis[x][y]=1; for(int i=0;i<8;i++){ tx=x-dx[i],ty=y-dy[i]; if(a[tx][ty]=='W'&&!vis[tx][ty]&&tx<=n&&tx>=1&&ty<=m&&ty>=1) dfs(tx,ty); } // vis[x][y]=0; } int main(){ scanf("%d%d",&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++){ if(a[i][j]=='W'&&!vis[i][j]){ ans++; dfs(i,j); } } cout<<ans; return 0; } ``` 参考
by _Clown__ @ 2023-08-21 15:37:30


你进来的时候那个 $vis$ 就要标记啊,要不然的话还是会死循环,而且你这一题完全没有必要打 $dfs$ ,直接 $bfs$ 即可。
by Guizy @ 2023-08-23 22:07:56


|