填塗顏色(有意思的dfs)
阿新 • • 發佈:2019-01-23
由數字0 組成的方陣中,有一任意形狀閉合圈,閉合圈由數字1構成,圍圈時只走上下左右4個方向。現要求把閉合圈內的所有空間都填寫成2.例如:6X6的方陣(n=6),塗色前和塗色後的方陣如下:
0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 1 1 1 0 0 1 1 1 1
0 1 1 0 0 1 0 1 1 2 2 1
1 1 0 0 0 1 1 1 2 2 2 1
1 0 0 0 0 1 1 2 2 2 2 1
1 1 1 1 1 1 1 1 1 1 1 1
輸入輸出格式
輸入格式:每組測試資料第一行一個整數:n。其中n(1<=n<=30)
接下來n行,由0和1組成的nXn的方陣。
方陣內只有一個閉合圈,圈內至少有一個0。
//感謝黃小U飲品指出本題資料和資料格式不一樣. 已修改(輸入格式)
已經填好數字2的完整方陣。
輸入輸出樣例
輸入樣例#1: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
思路: 題意就是找到被1包圍中的 0,然後變成2,那我們 在他的外圍在加一圈0,然後從(0,0)開始搜 ,遇到1就return ,遇到0就變成3,或者任意一個 非0,1的數,這樣 我們就會從(0,0)開始搜到圖的最後,這樣遇到的所有0就是“圈”外面的0,對吧 那麼沒有改變的0就是我們要把他變成2的0,完成
#include<stdio.h> #include<string.h> int n; int a[40][40],vis[40][40]; int move[4][2]={1,0,-1,0,0,1,0,-1}; void dfs(int x,int y) { if(x<0||x>n+1||y<0||y>n+1) { return ; } if(vis[x][y]) { return ; } if(a[x][y]==1) { return ; } if(a[x][y]==0) { a[x][y]=3; } vis[x][y]=1; for(int i=0;i<4;i++) { int dx=x+move[i][0]; int dy=y+move[i][1]; dfs(dx,dy); } } int main() { while(scanf("%d",&n)!=EOF) { memset(vis,0,sizeof(vis)); memset(a,0,sizeof(a)); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { scanf("%d",&a[i][j]); } } dfs(0,0); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(a[i][j]==0) { printf("2 "); } else if(a[i][j]==3) { printf("0 "); } else { printf("1 "); } } printf("\n"); } } }
輸出樣例#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<=n<=30