有两个主要错误
1. 洪水是从四面八方来的,因而要写成
```cpp
for(int i=1;i<=n;i++) if(a[i][1]=='0')dfs(i,1);
for(int i=1;i<=n;i++) if(a[i][m]=='0')dfs(i,m);
for(int i=1;i<=m;i++) if(a[1][i]=='0')dfs(1,i);
for(int i=1;i<=m;i++) if(a[n][i]=='0')dfs(n,i);
```
2.将```a[nx][ny]='*';```放到```for```循环的外面,因为会出现四周无法更新成```*```的情况
by 小小蒲公英 @ 2023-11-14 19:51:43
@[小小蒲公英](/user/392816) 第二点不是很理解.
by lhs_chris @ 2023-11-14 19:56:32
@[lhs_chris](/user/544007) Hack:
```
5 5
*0***
*****
*****
*****
*****
```
by 小小蒲公英 @ 2023-11-14 20:08:15
AC CODE:
```cpp
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+10;
const int M=2023;
const int inf=0x3f3f3f3f;
int n,m,ans;
char a[514][514];
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0},vis[514][514];
void dfs(int x,int y)
{
a[x][y]='*';
for(int i=0;i<4;i++)
{
int nx=x+dx[i];
int ny=y+dy[i];
if(nx>=1 and nx<=n and ny>=1 and ny<=m and a[nx][ny]=='0')
{
dfs(nx,ny);
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("P1506_1.in","r",stdin);
freopen("1.txt","w",stdout);
#endif
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++) if(a[i][1]=='0')dfs(i,1);
for(int i=1;i<=n;i++) if(a[i][m]=='0')dfs(i,m);
for(int i=1;i<=m;i++) if(a[1][i]=='0')dfs(1,i);
for(int i=1;i<=m;i++) if(a[n][i]=='0')dfs(n,i);
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(a[i][j]=='0')ans++;
cout<<ans;
return 0;
}
```
by 小小蒲公英 @ 2023-11-14 20:09:31
@[小小蒲公英](/user/392816) 谢谢大佬 **orz**
by lhs_chris @ 2023-11-15 20:49:21