• -填涂颜色-


    题目描述

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

    输出

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

    样例输入

    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
    

    提示

    1≤n≤30

    参考代码:

    #include
    using namespace std;
    int n;
    int q[22500][2],hh,tt,kx,ky,gx,gy;
    int dx[]={1,0,-1,0};
    int dy[]={0,1,0,-1};
    int d[150][150];
    char a[150][150];
    bool b[150][150];
    bool around(int y,int x){
        bool s=true;
        if(y<=0||y>=n-1||x<=0||x>=n-1)
            return false;
        b[y][x]=true;
        if(a[y+1][x]=='0'&&!b[y+1][x])
            s=s&&around(y+1,x);
        if(a[y][x+1]=='0'&&!b[y][x+1])
            s=s&&around(y,x+1);
        if(a[y-1][x]=='0'&&!b[y-1][x])
            s=s&&around(y-1,x);
        if(a[y][x-1]=='0'&&!b[y][x-1])
            s=s&&around(y,x-1);
        return s;
    }
    void bfs(){
        while(hh!=tt){
            kx=q[hh][1];
            ky=q[hh][0];
            a[ky][kx]='2';
            hh++;
            for(int i=0;i<4;i++){
                int xx=kx+dx[i];
                int yy=ky+dy[i];
                if(xx>=0&&xx=0&&yy
                    tt++;
                    q[tt-1][0]=yy;
                    q[tt-1][1]=xx;
                    d[yy][xx]=d[ky][kx]+1;
                }
            }
        }
        return;
    }
    int main(){
        cin>>n;
        for(int i=0;i         for(int j=0;j             cin>>a[i][j];
        for(int i=0;i         for(int j=0;j             if(!b[i][j]&&a[i][j]=='0')
                    if(around(i,j)){
                        q[0][0]=i;
                        q[0][1]=j;
                        d[i][j]=1;
                        tt++;
                        bfs();
                        for(int i2=0;i2
                            for(int j2=0;j2                             cout<                         cout<<'\n';
                        }
                        return 0;
                    }
        return 0;
    }

  • 相关阅读:
    2041. 面试中被录取的候选人
    解决ubuntu系统python2.7安装uwsgi报错
    单目标应用:遗传算法(Genetic Algorithm,GA)求解微电网优化MATLAB
    Data Plane, Control Plane, Management Plane到底都是什么?
    Windows电脑上的多开器与分布式存储系统的关系
    element table多级表头
    如何解决双因素和多因素身份认证的大问题
    C语言经典算法实例1:求二维数组最大最小值
    Android S(31) APP 页面绘制流程
    世界杯来了,让 Towhee 带你多语言「以文搜球」!
  • 原文地址:https://blog.csdn.net/qybcjmy/article/details/126266496