bfs

bfs

P1162 填涂颜色

bfs思想

/*bfs 
方法是最外面一圈先加一圈 
然后所有0赋值成2 
接着做bfs,用队列,将能走的通的2赋值成0即不是闭合圈 
其实就是先假装0都不能走
然后走一下 将能走的通的0(现在是2)变为0 
*/
#include<bits/stdc++.h>
using namespace std;
const int N=40;
int g[N][N];
queue<pair<int,int> >q;//队列存能走的通的0的横纵坐标
int n; 
//方向向量
int dx[4] ={-1,0,1,0};//行 上右下左 
int dy[4] ={0,1,0,-1};//列 上右下左 
void bfs(){
	q.push({0,0});
	while(!q.empty()) {
		int x=q.front().first;
		int y=q.front().second;
		q.pop();
		for(int i=0;i<4;i++){
			if(g[x+dx[i]][y+dy[i]]==2){//下标小于0没关系因为那一定不为2就不执行if了
				g[x+dx[i]][y+dy[i]]=0;
				q.push(make_pair(x+dx[i],y+dy[i]));
			}
		}
	}
}
int main(){
cin>>n;
    //原图
for(int i=1;i<=n;i++){
	for(int j=1;j<=n;j++){
		cin>>g[i][j];
	}
}
    //外面多加1圈
for(int i=0;i<=n+1;i++){
	for(int j=0;j<=n+1;j++){
	if(g[i][j]==0){
		g[i][j]=2;
	}
	}
}
bfs();
 //结果
for(int i=1;i<=n;i++){
	for(int j=1;j<=n;j++){
		cout<<g[i][j]<<" ";
	}
	cout<<endl;
}
return 0;
}

 

posted @ 2025-02-23 20:27  Annaprincess  阅读(12)  评论(0)    收藏  举报