DFS用递归实现,BFS用队列实现
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 100 + 10;
char ch[maxn][maxn];
int idx[maxn][maxn];
int n,m;
void dfs(int a,int b,int id)
{
if(a < 1 || a > m || b < 1 || b > n)return;//出界
if(idx[a][b] || ch[a][b] != '@')return;//不是'@'或者已经访问过的格子
idx[a][b] = id;//连通分量的编号
for(int i = -1;i <= 1;i++)//横,竖,对角线,八个方向
{
for(int j = -1;j <= 1;j++)
{
if(i != 0 || j != 0)
{
dfs(a+i,b+j,id);//能走到这一步的都是同一个连通分量里的
}
}
}
}
int main()
{
while(scanf("%d%d",&m,&n)==2&&n && m)
{
int cnt = 0;//用于计数
for(int i = 1;i <= m;i++)
{
scanf("%s",ch[i]);//输入m行
}
memset(idx,0,sizeof(idx));//idx数组清零
for(int i = 1;i <= m;i++)
{
for(int j = 1;j <= n;j++)
{
if(ch[i][j] == '@' && !idx[i][j])//若idx[i][j]不为0,则表示已经被找过了,则不再进行计数
{
dfs(i,j,++cnt);
}
}
}
printf("%d\n",cnt);
}
}