关键思路转换:从边界为0开始搜索,并且都标记,这些标记的不会被1包围,被1包围的肯定0不会被标记到,所以到时候把没被标记的0就是变成2即可。
详细:
ACcode:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=35;
int a[N][N],n;
int idx[]={0,1,0,-1},idy[]={1,0,-1,0};
bool vis[N][N];
void dfs(int x,int y){
a[x][y]=3;//标记
for(int i=0;i<4;i++){
int xx=x+idx[i];
int yy=y+idy[i];
if(xx<1||xx>n||yy<1||yy>n||a[xx][yy]!=0) continue;
dfs(xx,yy);
}
}
void solve(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==1||i==n||j==1||j==n){
if(a[i][j]==0){
dfs(i,j);
}
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(a[i][j]==3){
cout<<"0 ";
}
else if(a[i][j]==1){
cout<<"1 ";
}
else{
cout<<"2 ";
}
}
cout<<"\n";
}
}
signed main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int t=1;
//cin>>t;
while(t--){
solve();
}
return 0;
}