题解:
先把题目给的n*n的矩阵外面加一圈0(不需要进行特殊操作,只需在读入的时候i=1,j=1即可),然后bfs(0,0)搜外围连通0的连通块,并标记上,这样圈内的0没标记的就输出2,圈外标记的0输出0;
#include<bits/stdc++.h>
using namespace std;
const int N=40;
typedef pair<int,int>PII;
int dx[]={-1,1,0,0},dy[]={0,0,1,-1};
int g[N][N],st[N][N];
int n;
void bfs(int x,int y)
{
queue<PII>q;
q.push({x,y});
st[x][y]=1;
while(q.size())
{
auto t=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int sx=t.first+dx[i],sy=t.second+dy[i];
if(st[sx][sy])continue;
if(sx<0||sx>n+1||sy<0||sy>n+1)continue;
if(g[sx][sy]==1)continue;
st[sx][sy]=1;
q.push({sx,sy});
}
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&g[i][j]);
}
}
bfs(0,0);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(g[i][j]==1)
printf("1 ");
else if(g[i][j]==0&&st[i][j])//被标记属于圈外的输出0
printf("0 ");
else//没被标记的属于圈内
printf("2 ");
}
printf("\n");
}
}