P1162 填涂颜色(dfs)

题目:https://www.luogu.org/problem/P1162

Description: 

由数字0组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向。现要求把闭合圈内的所有空间都填写成2.

 Solution

围圈内的部分不要动,把围圈和围圈外的部分进行标记,输出时,没有标记的部分,即圈内部分输出为2,其余按原图输出。

注意,在进行dfs时图要比实际输入的图大一圈,防止出现以下情况

6
0 0 0 0 0 0                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 0 1 1 1 1 
0 1 1 0 0 1        =>    0 1 1 2 2 1                       =>                      0 1 1 2 2 1 
1 1 1 0 1 1                1 1 1 2 1 1                                                  1 1 1 2 1 1
1 0 1 1 0 1                1 2 1 1 2 1                                                  1 0 1 1 2 1
1 0 1 1 1 1                1 2 1 1 1 1  (错误结果)                             1 0 1 1 1 1

Code

#include
using namespace std;
int n;
int Map[40][40];
int dir[4][2] = {1, 0, 0, 1, -1, 0, 0, -1};
int book[40][40];
void dfs(int x, int y)
{
    if(x < 0 || y < 0 || x > n + 1|| y > n + 1|| book[x][y] != 0) return ; //超过图的边界或到达围墙,返回
    book[x][y] = 1;

    for(int i = 0; i < 4; i++)
    {
        int nx = x + dir[i][0];
        int ny = y + dir[i][1];
        if(!book[nx][ny])
            dfs(nx, ny);
    }
}
int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= n; j++)
        {
            cin >> Map[i][j];
            if(Map[i][j] == 0) book[i][j] = 0;
            else book[i][j] = 1;
        }
    }
    dfs(0,0);

    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= n; j++)
        {
            if(book[i][j] == 0) cout << 2 << " ";
            else cout << Map[i][j] << " ";
        }
        cout <

 

你可能感兴趣的:(dfs)