题目说只有一个包围圈,所以除了与边界相连的0,其余0都在包围圈内,所以只要把边界遍历一遍,将与边界相邻的0都标记出来,剩下的0都是要转换成2的
`#include
struct hao{
int i,j;
} que[1000007];
int head=0,tail=0;
int main(){
int n,m1[4]={-1,1,0,0},m2[4]={0,0,-1,1};
int lst[32][32],flag[32][32]={0};
scanf("%d",&n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
scanf("%d",&lst[i][j]);
if((i0||in-1||j0||jn-1)&&lst[i][j]0){
que[tail].i=i;
que[tail].j=j;
flag[i][j]=1;
tail++;
}
}
}
if(tail){
while(head<tail){
head++;
int x=que[head-1].i,y=que[head-1].j;
for(int i=0;i<4;i++){
int new_x=x+m1[i],new_y=y+m2[i];
if(new_x>=0&&new_x<n&&new_y>=0&&
new_y<n&&flag[new_x][new_y]0&&lst[new_x][new_y]0){
que[tail].i=new_x;
que[tail].j=new_y;
flag[new_x][new_y]=1;
tail++;
}
}
lst[x][y]=-1;
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(lst[i][j]0) printf("2");
if(lst[i][j]1) printf("1");
if(lst[i][j]-1) printf("0");
if(j==n-1) printf("\n");
else printf(" ");
}
}
return 0;
} `