[蒟蒻的學習記錄]BFS的聯通塊與計步
阿新 • • 發佈:2018-12-16
[蒟蒻的學習記錄]BFS的聯通塊與計步
BFS的聯通塊問題(模板)
1 #include <bits/stdc++.h> 2 using namespace std; 3 struct node { 4 int x; 5 int y; 6 }; 7 queue<node> Q; 8 const int maxn=200; 9 int maap[maxn][maxn]; 10 bool book[maxn][maxn]= {false}; 11 int m,n; 12 int next[4][2]= { 13 0,-1,14 0,1, 15 -1,0, 16 1,0 17 }; 18 void bfs(int x1,int y1) 19 { 20 node nn; 21 nn.x=x1; 22 nn.y=y1; 23 while(!Q.empty()) Q.pop(); 24 Q.push(nn); 25 book[x1][y1]=true; 26 while(Q.empty()==false) 27 { 28 node now=Q.front(); 29 Q.pop(); 30 for(int i=0; i<4; i++) 31 { 32 int nx=now.x+next[i][0]; 33 int ny=now.y+next[i][1]; 34 if(nx<0 || nx>m-1 || ny<0 || ny>n-1) 35 { 36 continue; 37 } 38 if(maap[nx][ny]==0 || book[nx][ny]==true) 39 {40 continue; 41 } 42 node final; 43 final.x=nx; 44 final.y=ny; 45 book[nx][ny]=true; 46 Q.push(final); 47 } 48 } 49 } 50 int main() { 51 cin>>m>>n; 52 for(int i=0; i<m; i++) 53 { 54 for(int j=0; j<n; j++) 55 { 56 cin>>maap[i][j]; 57 } 58 } 59 int ans=0; 60 61 for(int i=0; i<m; i++) 62 { 63 for(int j=0; j<n; j++) 64 { 65 if(maap[i][j]==1 && book[i][j]==false) 66 { 67 bfs(i,j); 68 ans++; 69 } 70 } 71 } 72 cout<<ans<<endl; 73 return 0; 74 }
BFS的計步(最短路)問題(模板)
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn=100; 4 //最大尺寸 5 queue<int> qx,qy; 6 //橫縱座標佇列 7 int stx,sty,edx,edy; 8 //起點終點座標 9 bool vis[maxn+10][maxn+10]; 10 //訪問標記 11 int maap[maxn+10][maxn+10]; 12 //零一迷宮 13 int n,m; 14 //尺寸 15 int direx[]={1,0,-1,0}; 16 int direy[]={0,1,0,-1}; 17 //四向聯通 18 int range[maxn+10][maxn+10]; 19 //當前查詢深度 20 int end_range=-1; 21 //最終深度 22 void bfs(int stx,int sty) 23 { 24 vis[stx][sty]=true; 25 qx.push(stx); 26 qy.push(sty); 27 //起點壓入佇列 28 range[stx][sty]=0; 29 //起點查詢深度 30 while(!qx.empty()) 31 //佇列的最後一個元素沒被彈出去 32 { 33 for(int i=0;i<4;i++) 34 //四向聯通入佇列 35 { 36 int x_now=qx.front()+direx[i]; 37 int y_now=qy.front()+direy[i]; 38 //進入附近塊 39 if(x_now>= 1&& x_now<=n && y_now>=1&&y_now<=m&&maap[x_now][y_now]!=0&&!vis[x_now][y_now]) 40 //不出界非障礙未訪問 41 { 42 vis[x_now][y_now]=true; 43 //打訪問標記 44 qx.push(x_now); 45 qy.push(y_now); 46 //壓入佇列 47 end_range=range[x_now][y_now]=range[qx.front()][qy.front()]+1; 48 } 49 } 50 qx.pop(); 51 qy.pop(); 52 //彈出已經被搜完的元素 53 } 54 return; 55 } 56 int main() 57 { 58 cin>>n>>m; 59 for(int i=1;i<=n;i++) 60 { 61 for(int j=1;j<=m;j++) 62 { 63 cin>>maap[i][j]; 64 } 65 } 66 cin>>stx>>sty>>edx>>edy; 67 bfs(stx,sty); 68 cout<<end_range<<endl; 69 return 0; 70 }