洛谷----P1162 填涂颜色

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

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

接下来nn行,由00和11组成的n imes 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

说明/提示

1 le n le 301n30

题解: 直接求圈内的0不好求,我们可以通过标记圈外的0,即将圈外的0标记完,剩下的就是圈内的0;

从上下左右每个边界的0出入手

AC代码:

#include<bits/stdc++.h>
using namespace std;
int arr[33][33];
struct stu{
    int x,y;
};
int n;
int d[4][2]={1,0,0,1,-1,0,0,-1};
void bfs(int x,int y){
    queue<stu >que;
    arr[x][y]=3;
    que.push({x,y});
    while(que.size()){
        stu s=que.front();
        que.pop();
        for(int i=0;i<4;i++){
            int dx=s.x+d[i][0];
            int dy=s.y+d[i][1];
            if(dx>=1&&dy>=1&&dx<=n&&dy<=n&&arr[dx][dy]==0){
                arr[dx][dy]=3;
                que.push({dx,dy});
            }
        }
    }
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            scanf("%d",&arr[i][j]);
    for(int i=1;i<=n;i++){
        if(arr[i][1]==0) bfs(i,1);
        if(arr[i][n]==0) bfs(i,n);
        if(arr[1][i]==0) bfs(1,i);
        if(arr[n][i]==0) bfs(n,i);
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++)
            if(arr[i][j]==3) cout<<0<<" ";
            else if(arr[i][j]==0) cout<<2<<" ";
            else cout<<1<<" "; 
        cout<<endl;
    }
    return 0;
}

 想同类型题目:https://www.luogu.org/problem/P1506

原文地址:https://www.cnblogs.com/Accepting/p/11566602.html