洛谷-P1162 填涂颜色

洛谷-P1162 填涂颜色

原题链接:https://www.luogu.com.cn/problem/P1162


题目描述

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

接下来n行,由0和1组成的\(n \times n\)的方阵。

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

输出格式

已经填好数字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 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

C++代码

#include <iostream>
#include <queue>
using namespace std;

int n,a[32][32],dir[][2]={{1,0},{0,1},{-1,0},{0,-1}};
queue<int> q;

void bfs(int x, int y) {
    int i,j,dx,dy;
    a[x][y]=0;
    q.push(x);
    q.push(y);
    while(!q.empty()) {
        x=q.front();
        q.pop();
        y=q.front();
        q.pop();
        for(int i=0;i<4;++i) {
            if(x==0&&i==2) continue;
            if(x==n+1&&i==0) continue;
            if(y==0&&i==3) continue;
            if(y==n+1&&i==1) continue;
            dx=x+dir[i][0];
            dy=y+dir[i][1];
            if(a[dx][dy]==2) {
                a[dx][dy]=0;
                q.push(dx);
                q.push(dy);
            }
        }
    }
}

int main() {
    int i,j;
    cin>>n;
    for(i=1;i<=n;++i)
        for(j=1;j<=n;++j)
            cin>>a[i][j];
    for(i=0;i<=n+1;++i)
        for(j=0;j<=n+1;++j)
            if(a[i][j]==0)
                a[i][j]=2;
    bfs(0,0);
    for(i=1;i<=n;++i) {
        for(j=1;j<=n;++j)
            cout<<a[i][j]<<' ';
        cout<<endl;
    }
    return 0;
}
posted @ 2020-05-14 09:19  yuzec  阅读(110)  评论(0编辑  收藏  举报