填涂颜色
由数字0组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向。现要求把闭合圈内的所有空间都填写成2.例如:6×6的方阵(n=6),涂色前和涂色后的方阵如下:
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1
0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 2 2 1 1 1 2 2 2 1 1 2 2 2 2 1 1 1 1 1 1 1
1 #include<iostream> 2 #include<cstdio> 3 #include<queue> 4 using namespace std; 5 const int maxn=37; 6 int n; 7 int dx[5]={0,0,-1,1}; 8 int dy[5]={1,-1,0,0}; 9 queue<int>q1; 10 queue<int>q2; 11 int map[maxn][maxn]; 12 bool vis[maxn][maxn]; 13 bool check(int x,int y){ 14 if(x<1||x>n||y<1||y>n) return false; 15 return true; 16 } 17 void bfs(int x,int y){ 18 vis[x][y]=true; 19 q1.push(x);q2.push(y); 20 while(!q1.empty()){ 21 int xx=q1.front();q1.pop(); 22 int yy=q2.front();q2.pop(); 23 for(int i=0;i<4;i++){ 24 for(int j=0;j<4;j++){ 25 int ix=xx+dx[i];int iy=yy+dy[i]; 26 if(!check(ix,iy)) continue; 27 if(map[ix][iy]==0&&!vis[ix][iy]) bfs(ix,iy); 28 } 29 } 30 } 31 } 32 int main(){ 33 cin>>n; 34 for(int i=1;i<=n;i++){ 35 for(int j=1;j<=n;j++){ 36 cin>>map[i][j]; 37 if(map[i][j]==1) vis[i][j]=true; 38 } 39 } 40 for(int i=1;i<=n;i=i+n-1){ 41 for(int j=1;j<=n;j++){ 42 if(!vis[i][j]) bfs(i,j); 43 } 44 } 45 for(int i=1;i<=n;i+=n-1){ 46 for(int j=1;j<=n;j++){ 47 if(!vis[j][i]) bfs(j,i); 48 } 49 } 50 for(int i=1;i<=n;i++){ 51 for(int j=1;j<=n;j++){ 52 if(map[i][j]==1) cout<<1<<" "; 53 if(map[i][j]==0){ 54 if(vis[i][j]) cout<<0<<" "; 55 else cout<<2<<" "; 56 } 57 } 58 cout<<endl; 59 } 60 return 0; 61 }