我這次還沒有理解
#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;}