zoukankan      html  css  js  c++  java
  • 洛谷----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

  • 相关阅读:
    Redis数据持久化机制AOF原理分析一---转
    Linux中常用头文件的作用--转
    Signal Handling--ref
    Linux 信号signal处理函数--转
    深入redis内部--初始化服务器
    haproxy 503 service unavailable no server is avaible to handle this request
    linux下logrotate配置和理解---转
    extjs_09_定义自己的页面组件
    BZOJ 3211 弗洛拉前往国家 树阵+并检查集合
    atitit.无损传输二进制数据串传输网络
  • 原文地址:https://www.cnblogs.com/Accepting/p/11566602.html
Copyright © 2011-2022 走看看