P1162 填涂颜色

题目描述

由数字0组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向。现要求把闭合圈内的所有空间都填写成22.例如: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

输入格式

每组测试数据第一行一个整数n(1n30)

接下来n行,由01组成的n×n的方阵。

方阵内只有一个闭合圈,圈内至少有一个0。

//感谢黄小U饮品指出本题数据和数据格式不一样. 已修改(输入格式)

输出格式

已经填好数字2的完整方阵。

#include <iostream>
using namespace std;
int a[55][55], b[55][55];
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};
int n;
void dfs(int p, int q)
{
    if (p < 0 || p > n + 1 || q < 0 || q > n + 1 || a[p][q] != 0)
    {
        return;
    }
    a[p][q] = 1;
    for (int i = 0; i <= 3; i++)
    {
        dfs(p + dx[i], q + dy[i]);
    }
}
int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            cin >> b[i][j];
            if (b[i][j] == 0)
            {
                a[i][j] = 0;
            }
            else
            {
                a[i][j] = 2;
            }
        }
    }
    dfs(0, 0);
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            if (a[i][j] == 0)
            {
                cout << 2 << " ";
            }
            else
            {
                cout << b[i][j] << " ";
            }
        }
        cout << endl;
    }
    return 0;
}

 

posted @ 2022-01-14 15:57  亚托莉的亚托莉  阅读(36)  评论(0)    收藏  举报