//宽搜染色
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
typedef pair<int,int> PII; //使用pair类型来存储坐标
const int N = 35;
const int dx[4] = {0,1,0,-1};
const int dy[4] = {1,0,-1,0};
int g[N][N];
bool vis[N][N];
int n;
void bfs(){
queue< PII >q;
vis[0][0] = true; //先把0,0点存入,从此处开始宽搜
q.push(PII(0,0));
while(q.size()){
PII t = q.front();
q.pop();
for(int i = 0;i < 4;i++){
int xx = t.first + dx[i],yy = t.second + dy[i];
if(xx>=0&&xx<=n+1&&yy>=0&&yy<=n+1&&vis[xx][yy]==false){ //此处一定要比存的图多扫一圈,因为可能出边缘1包围0,使得0被扫不到的情况
q.push(PII(xx,yy));
g[xx][yy] = 1; //如果搜到1包围之外的0,则染成1
vis[xx][yy] = true;
}
}
}
}
int main(){
cin >> n;
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++){
cin >> g[i][j];
if(g[i][j] == 1){
vis[i][j] = true; //标记上此点,代表边界1是不能走的
g[i][j] = 3; //把所有的边界1变成3,以和染色后的1区分
}
}
}
bfs();
for(int i = 1;i <= n;i++){ //根据染色结果来输出答案
for(int j = 1;j <= n;j++){
if(g[i][j] == 1)cout << "0 "; //如果被搜到染成1,则这是个1包围之外的0
if(g[i][j] == 3)cout << "1 "; //如果是3,那么代表这是个边界
if(g[i][j] == 0)cout << "2 "; //如果没有被搜到,则代表是1包围之内的,则依据题目变成2
}
puts("");
}
return 0;
}
洛谷-P1162-填涂颜色
于 2023-12-27 22:27:59 首次发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)