找联通块
多写一句,dfs递归调用,bfs用队列调用
#if 1
///uva572
#include <bits/stdc++.h>
const int maxn = 105;
char pic[maxn][maxn]; ///picture 缩写 存图
int m,n,idx[maxn][maxn]; ///idx用来标记
void dfs(int r,int c,int id) /// r : row c : col
{
if (r<0||r>=m||c<0||c>=n) return; ///出了图的范围不管
if(idx[r][c]>0 || pic[r][c] !='@')return; ///没有'@' 或者已经标记了也不管
idx[r][c]= id; ///打一个标记
for(int dr=-1;dr<=1;dr++)
for(int dc=-1;dc<=1;dc++)
if(dr!=0 || dc!=0) dfs(r+dr,c+dc,id); ///自己本身的点不管
}
int main()
{
while(scanf("%d%d",&m,&n)==2 && m && n)
{
for(int i=0;i<m;i++)
scanf("%s",pic[i]);
memset(idx,0,sizeof(idx));
int cnt=0;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
if(idx[i][j]==0 && pic[i][j] == '@')
dfs(i,j,++cnt);
printf("%d\n",cnt);
}
return 0;
}
#endif // 1