这道题做的比较坎坷,还曾经RE了......
比较基础的BFS ,要反着来考虑。
考虑:没有被全包围的0,标记。
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e6 + 5; 4 5 int xx[4] = {0,0,1,-1}; 6 int yy[4] = {1,-1,0,0}; 7 int maps[35][35]; 8 int used[35][35]; 9 int n; 10 11 struct node 12 { 13 int x,y; 14 }; 15 16 17 void print() 18 { 19 for(int i=0;i<n;i++) 20 for(int j=0;j<n;j++) 21 if(used[i][j]) maps[i][j]=3; 22 for(int i=0;i<n;i++) 23 { 24 for(int j=0;j<n;j++) 25 { 26 if(maps[i][j]==3) printf("0 "); 27 else if(maps[i][j]==0) printf("2 "); 28 else printf("1 "); 29 } 30 printf(" "); 31 } 32 } 33 34 void bfs(int a,int b) 35 { 36 queue<node> q; 37 if(maps[a][b]==1) return; 38 q.push(node{a,b}); 39 used[a][b] = 1; 40 while(!q.empty()) 41 { 42 node p=q.front(); 43 q.pop(); 44 for(int i=0;i<4;i++) 45 { 46 int dx = p.x+xx[i]; 47 int dy = p.y+yy[i]; 48 if(dx<0 || dx>n-1 || dy<0 || dy>n-1) continue; 49 if(used[dx][dy]) continue; 50 if(maps[dx][dy]) continue; 51 used[dx][dy] = 1; 52 q.push(node{dx,dy}); 53 } 54 } 55 } 56 int main() 57 { 58 scanf("%d",&n); 59 for(int i=0;i<n;i++) 60 for(int j=0;j<n;j++) scanf("%d",&maps[i][j]); 61 for(int i=0;i<n;i++) bfs(i,0); 62 for(int i=0;i<n;i++) bfs(0,i); 63 for(int i=0;i<n;i++) bfs(i,n-1); 64 for(int i=0;i<n;i++) bfs(n-1,i); 65 print(); 66 return 0; 67 }