#include<bits/stdc++.h>
using namespace std;
int dx[] = {1,0,-1,0};
int dy[] = {0,1,0,-1};
int main(){
int n;
cin>>n;
queue<pair<int,int>> q;
vector<vector<int>> v(n+2,vector<int>(n+2));// 初始化矩阵,增加边界,实际大小为 (n+2) x (n+2)
for(int i=1;i<=n;i++){ // 输入矩阵内容,从 (1,1) 到 (n,n),避开边界
for(int j=1;j<=n;j++){
cin>>v[i][j];
}
}
q.push({0,0});// 将左上角外部的初始点 (0,0) 推入队列,并标记为访问过(-1)
v[0][0] = -1;
while(q.size()){
auto [x,y] = q.front();
q.pop();
for(int i=0;i<4;i++){
int nx = x + dx[i];
int ny = y + dy[i];
if(nx >= 0 && nx <= n+1 && ny >= 0 && ny <= n+1 && v[nx][ny]==0){
v[nx][ny]=-1;
q.push({nx,ny});
}
}
}
for(int i=1;i<=n;i++){// 遍历矩阵,将未被标记为边界连通的 0 替换为 2
for(int j=1;j<=n;j++){
if(v[i][j] == 0){
v[i][j] = 2;
}
}
}
for(int i=1;i<=n;i++){// 输出最终矩阵,恢复边界连通区域的标记为 0
for(int j=1;j<=n;j++){
if(v[i][j] == -1){
v[i][j] = 0;
}
cout<<v[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
通过在原矩阵的四周加上一圈额外的边界,扩展后的矩阵为 (n+2) x (n+2),
BFS 处理将与边界连通的所有 0
标记为 -1
,表示这些 0
已经被访问过且是边界连通的。
经过 BFS 处理后,剩余的 0
就是闭合区域的 0。
将剩下的 0
填充为 2
,即为闭合区域。
最后再将-1恢复成0输出填充后的矩阵
标签:填涂,颜色,边界,int,矩阵,BFS,vector,&& From: https://blog.csdn.net/Ct314/article/details/143894938