#include<bits/stdc++.h>
#define MAX_N 35
using namespace std;
int n;
int f[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int mp[MAX_N][MAX_N],vis[MAX_N][MAX_N],cnt=0;
bool flag[MAX_N*MAX_N];//大小要开对
void bfs(int sx,int sy) {
vis[sx][sy]=cnt;
queue<pair<int,int>>que;
que.push({sx,sy});
while(!que.empty()) {
int now_x=que.front().first,now_y=que.front().second;
que.pop();
for(int i=0;i<4;i++) {
int next_x=now_x+f[i][0],next_y=now_y+f[i][1];
if(next_x<1||next_x>n||next_y<1||next_y>n) {
flag[cnt]=false;
continue;
}
if(vis[next_x][next_y]||mp[next_x][next_y]==1) {
continue;
}
vis[next_x][next_y]=cnt;
que.push({next_x,next_y});
}
}
}
int main() {
cin>>n;
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
cin>>mp[i][j];
}
}
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
if(vis[i][j]==0&&mp[i][j]!=1) {
cnt++;
flag[cnt]=true;
bfs(i,j);
}
}
}
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
if(mp[i][j]==1) {
cout<<1<<" ";
}else if(flag[vis[i][j]]) {
cout<<2<<" ";
}else {
cout<<0<<" ";
}
}
cout<<endl;
}
fclose(stdin);
fclose(stdout);
return 0;
}
如果像我一样使用 flag 数组进行标记是否为闭合圈内的0的连通块,一定要开对大小!