题目大意:
有一个大小为N*M的园子,雨后积起了水。八连通的积水被认为是连接在一起的。请求出院子里共有多少水洼?
样例
10 12 W........WW. .WWW.....WWW ....WW...WW. .........WW. .........W.. ..W......W.. .W.W.....WW. W.W.W.....W. .W.W......W. ..W.......W.输出
3
思考
不难想出两个W在同一个水坑这个关系是一个等价关系。那么我只要依次从头扫到尾,遇到一个W,就把所有的与之有这个关系的全部标记出来就好。我们可以顺藤摸瓜到底,找到一个就继续往后找。这样就可以把当前的这个水坑里的全部都标记了。这显然是一个深度优先搜索(DEPTH FIRST SEARCH).
代码如下:
#include<stdio.h>
char field[128][128];
int n,m;
void dfs(int x,int y)
{
int dx,dy,a,b;
field[x][y]='.';
for(dx=-1;dx<=1;dx++)
for(dy=-1;dy<=1;dy++)
{
a=x+dx;
b=y+dy;
if( (a>=0 && a<n) && (b>=0 && b<m) && field[a][b]=='W')
dfs(a,b);
}
}
int main()
{
int i,j,num=0;
while(scanf("%d%d",&n,&m)==2)
{
num=0;
for(i=0;i<n;i++)
scanf("%s",field[i]);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
if(field[i][j]=='W')
{
dfs(i,j);
num++;
}
}
printf("%d\n",num);
}
return 0;
}