#include<bits/stdc++.h>
using namespace std;
const int N=40;
int n,mp[N][N],vis[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//vis[][]方向数组上下左右四个方向
bool st[N][N];
struct node{
int x,y;
}a[1000];
void bfs(int x,int y){
queue< node >Q;
//将(0,0)作为广搜的开头
Q.push({x,y});
st[x][y]=1;
while(!Q.empty())
{
//取出队头
node tm=Q.front();
int x=tm.x, y=tm.y;
Q.pop();
//将和队头相邻0全部标记并入队
for(int i=0;i<4;i++)
{
int tx=x+vis[i][0],ty=y+vis[i][1];
//注意!!应该将遍历范围扩大至绿色方框,即将合法区间从[1][1]~[n][n]扩大至[0][0]~[n+1][n+1]
//如果相邻的位置中填的是0 并且 在合法区间内
if(tx>=0&&ty>=0&&tx<=n+1&&ty<=n+1&&mp[tx][ty]==0&&st[tx][ty]==0)
{
st[tx][ty]=1;//标记该0是和边界联通的
Q.push({tx,ty});//并且入队
}
}
}
return;
}
int main()
{
cin>>n;
//画图的中的蓝色框 mp[1][1]~mp[n][n]
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>mp[i][j];
//将绿色边界中的(0,0)作为广搜的开头,并将和它相连的0全部标记
bfs(0,0);
for(int i=1;i<=n;i++,puts(""))
for(int j=1;j<=n;j++)
{
if(mp[i][j]==0&&st[i][j]==0)//如果原来是0,并且没有被标记过
cout<<2<<' ';//那么填充为2
else
cout<<mp[i][j]<<' ';//否则原样输出,等同于输出0
}
return 0;
}
P1162 填涂颜色
最新推荐文章于 2025-05-18 19:14:41 发布