真的不想说这几天自己的状态, 一道不算难的DFS题却卡了我很久,到最后却发现自己写掉了DFS调用~囧~
其实算法比较简单,从四周开始搜索就行了,也就是人为在四周加上一圈洪水~
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=510;
int n,m,ans,movex[4]={0,1,-1,0},movey[4]={1,0,0,-1};
char map[maxn][maxn];
bool vis[maxn][maxn];
int r[maxn][maxn];
void DFS(int x,int y)
{
vis[x][y]=1;
for(int i=0;i<4;i++)
{
int itx=x+movex[i];
int ity=y+movey[i];
if(vis[itx][ity]||map[itx][ity]=='*')
continue;
r[itx][ity]=1;
DFS(itx,ity);
}
}
int main()
{
while(scanf("%d%d",&m,&n)!=EOF)
{
memset(vis,0,sizeof(vis));
memset(r,0,sizeof(r));
for(int i=0;i<=n+1;i++)
vis[0][i]=vis[m+1][i]=1;
for(int i=0;i<=m+1;i++)
vis[i][0]=vis[i][n+1]=1;
for(int i=1;i<=m;i++)
scanf("%s",map[i]+1);
ans=0;
for(int i=1;i<=n;i++)
{
if(map[1][i]=='0')
{
r[1][i]=1;
DFS(1,i);
}
if(map[m][i]=='0')
{
r[m][i]=1;
DFS(m,i);
}
}
for(int i=1;i<=m;i++)
{
if(map[i][1]=='0')
{
r[i][1]=1;
DFS(i,1);
}
if(map[i][n]=='0')
{
r[i][n]=1;
DFS(i,n);
}
}
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
if(map[i][j]=='0'&&!r[i][j])
ans++;
printf("%d\n",ans);
}
return 0;
}