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;
}

浙公网安备 33010602011771号