1. 程式人生 > >填塗顏色(有意思的dfs)

填塗顏色(有意思的dfs)

由數字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