1. 程式人生 > >dfs 填充顏色

dfs 填充顏色

題目描述

由數字00組成的方陣中,有一任意形狀閉合圈,閉合圈由數字11構成,圍圈時只走上下左右44個方向。現要求把閉合圈內的所有空間都填寫成22.例如:6 \times 66×6的方陣(n=6n=6),塗色前和塗色後的方陣如下:

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
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

 

輸入輸出格式

輸入格式:

 

每組測試資料第一行一個整數n(1 \le n \le 30)n(1≤n≤30)

接下來nn行,由00和11組成的n \times nn×n的方陣。

方陣內只有一個閉合圈,圈內至少有一個00。

//感謝黃小U飲品指出本題資料和資料格式不一樣. 已修改(輸入格式)

 

輸出格式:

 

已經填好數字22的完整方陣。

 

輸入輸出樣例

輸入樣例#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 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

分析:可以從四周開始dfs能搜到的標記一下,那麼搜不到的就是中間被包圍的。

程式碼如下:

#include<iostream>
#include<cstdio>
using namespace std;
int a[100][100],b[100][100]={0};
int n,x,y;

void dfs(int x,int y)
{
    if(x>n||x<1||y>n||y<1||a[x][y]!=0)//判斷是否越界 
        return;
    a[x][y]=1;
    dfs(x+1,y);
    dfs(x-1,y);
    dfs(x,y+1);
    dfs(x,y-1);//四個方向 
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            cin>>a[i][j];
            if(a[i][j]==1) b[i][j]=-1;//b用來存原來的位置 
        }
    int flag=0;
    for(int i=1;i<=n;i++)
    {
    if(a[i][1]!=1) dfs(i,1);
    if(a[i][n]!=1) dfs(i,n);//搜第i行的第一列和第n列 
    }
    for(int i=1;i<=n;i++)
    {
    if(a[1][i]!=1) dfs(1,i);
    if(a[n][i]!=1) dfs(n,i);//搜第i列的第一行和第n行 
    } 
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(b[i][j]==-1) printf("1 ");
            else
            if(a[i][j]==0) printf("2 ");
            else printf("0 ");
        }
        printf("\n");
    }//輸出,如果這個看不懂的話建議刷P1000(大牛分站的!); 
    return 0;
}
//程式碼如下: