zoukankan      html  css  js  c++  java
  • P1162 填涂颜色 题解(勿抄袭)

    题目描述

    由数字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的完整方阵。

    输入输出样例

    输入#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

    思路:

    首先看数据,很明显,绝对可以用深搜,但个人其实比较偏向于用广搜233(想用深搜的朋友们自己想哈

    可以将外面一圈的元素标记为1,再存储元素为0的行列下标,最后根据下标标记为2即可

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    int a[35][35],b[35][35],n,dx,dy;
    int d[2][4]={{1,-1,0,0},{0,0,1,-1}};
    struct node{
        int r,c;
    };
    void BFS(){
        node m;
        queue<node> q;
        m.c=0,m.r=0;
        q.push(m);
        while(!q.empty()){
            node front=q.front();
            q.pop();
            for(int i=0;i<4;++i){
                dx=front.r+d[0][i];
                dy=front.c+d[1][i];
                if(dx>=0&&dx<=n+1&&dy>=0&&dy<=n+1&&a[dx][dy]==0){
                    a[dx][dy]=-1;
                    node m1;
                    m1.r=dx,m1.c=dy;
                    q.push(m1);
                }
            }
     
        }
    }
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;++i)
            for(int j=1;j<=n;++j)
                scanf("%d",&a[i][j]);
        for(int i=0;i<=n+1;++i){
            a[0][i]=0;
            a[n+1][i]=0;
            a[i][0]=0;
            a[i][n+1]=0;
        }
        BFS();
        for(int i=1;i<=n;++i){
            for(int j=1;j<=n;++j){
                if(a[i][j]==-1)
                    printf("0 ");
                 else if(a[i][j]==0)
                    printf("2 ");
                else
                    printf("%d ",a[i][j]);
            }
            printf("
    ");
        }
        return 0;
    }
    
    她透过我的血,看到了另一抹殷红
  • 相关阅读:
    rs
    stm32f767 usoc3
    stm32f767 RTT 日志
    stm32f767 标准库 工程模板
    stm32f767 HAL 工程模板
    docker tab 补全 linux tab 补全
    docker anconda 依赖 下载 不了
    docker run 常用 指令
    linux scp 命令
    Dockerfile 常用参数说明
  • 原文地址:https://www.cnblogs.com/zhangbeini/p/13771265.html
Copyright © 2011-2022 走看看