码一下,写两个数组会爆栈,只能在dfs里用赋值的数组,用标记数组就会爆栈
今天来看看BFS,然后又用DFS敲了一下,下面代码
#include <bits/stdc++.h> using namespace std; int a[35][35],vis[35][35],n; int k[4][2]={{1,0},{0,1},{-1,0},{0,-1}}; void dfs(int x,int y) { if(x>=n || x<0 || y>=n || y<0) { return ; } else { for(int i=0;i<4;i++) { if(a[x+k[i][0]][y+k[i][1]]==0 && !vis[x+k[i][0]][y+k[i][1]]) { vis[x+k[i][0]][y+k[i][1]]=1; dfs(x+k[i][0],y+k[i][1]); } } } } int main() { cin>>n; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { cin>>a[i][j]; if(a[i][j]==1) vis[i][j]=1; } } for(int j=0;j<n;j++)//上边 { if(a[0][j]==0 && !vis[0][j]) dfs(0,j); } for(int j=0;j<n;j++)//下边 { if(a[n-1][j]==0 && !vis[n-1][j]) dfs(n-1,j); } for(int i=0;i<n;i++)//左边 { if(a[i][0]==0 && !vis[i][0]) dfs(i,0); } for(int i=0;i<n;i++) { if(a[i][n-1]==0 && !vis[i][n-1]) dfs(i,n-1); } for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(!vis[i][j]) cout<<2<<" "; else cout<<a[i][j]<<" "; } cout<<endl; } return 0; }
用vis数组来标记原来的数字1和之后所查找的四个边的联通0,vis打过标记后就不用去掉了
输出的时候按是否有无标记输出,有标记输出原来的数,没标记输出2
然后是BFS,下面代码
#include <bits/stdc++.h> using namespace std; int a[35][35],vis[35][35],n; int t[4][2]={{1,0},{0,1},{-1,0},{0,-1}}; queue<int> q; void bfs(int x,int y) { vis[x][y]=1; q.push(x); q.push(y); while(!q.empty()) { int k=q.front(); q.pop(); int l=q.front(); q.pop(); for(int i=0;i<4;i++) { if(a[k+t[i][0]][l+t[i][1]]==0 && k+t[i][0]>=0 && k+t[i][0]<n && l+t[i][0]>=0 && l+t[i][0]<n && !vis[k+t[i][0]][l+t[i][1]]) { vis[k+t[i][0]][l+t[i][1]]=1; q.push(k+t[i][0]); q.push(l+t[i][1]); } } } } int main() { cin>>n; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { cin>>a[i][j]; if(a[i][j]==1) vis[i][j]=1; } } for(int j=0;j<n;j++)//上边 { if(!a[0][j] && !vis[0][j]) bfs(0,j); } for(int j=0;j<n;j++)//下边 { if(!a[n-1][j] && !vis[n-1][j]) bfs(n-1,j); } for(int i=0;i<n;i++)//左边 { if(!a[i][0] && !vis[i][0]) bfs(i,0); } for(int i=0;i<n;i++)//右边 { if(!a[i][n-1] && !vis[i][n-1]) bfs(i,n-1); } for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(!vis[i][j]) cout<<2<<" "; else cout<<a[i][j]<<" "; } cout<<endl; } return 0; }