我这次还没有理解
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue> //包含队列使用
using namespace std;
int dir[8][2]={{1,0},{0,1},{-1,0},{0,-1},{1,-1},{-1,1},{1,1},{-1,-1}};//同样是用dir控制方向
char G[101][101]; //存数据
bool vis[101][101];//标记
int n,m; //注意。此处依题意,m为行,n为列,与之前讲过的代码相反
void BFS(int si,int sj){ //si sj为广搜起始点的坐标
queue<int>Q;
Q.push(si); //将坐标入队列,先行(i),后列(j)
Q.push(sj);
vis[si][sj]=1;//将起点标记
while(!Q.empty()){ //当队列非空时,持续进行搜索
int x=Q.front();Q.pop(); //将对首的点取出
int y=Q.front();Q.pop();
for(int i=0;i<8;i++){ //此处与dfs相同,访问8个方向
int fx=x+dir[i][0];
int fy=y+dir[i][1];
if(fx>=0&&fx<m&&fy>=0&&fy<n){
if(G[fx][fy]=='@'&&!vis[fx][fy]){
vis[fx][fy]=1;
Q.push(fx);//与dfs不同的是,dfs在此时进行递归调用
Q.push(fy);//而bfs进行的是入队操作。
}
}
}
}
}
int main(){//主函数部分,与dfs基本相同。
while(scanf("%d%d",&m,&n)!=EOF&&(m||n)){
memset(vis,0,sizeof(vis));
for(int i=0;i<m;i++){
scanf("%s",G[i]);
}
int sum=0;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++){
if(!vis[i][j]&&G[i][j]=='@'){
BFS(i,j);
sum++;
}
}
cout<<sum<<endl;
}
return 0;
}