• 洛谷P1162


    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(1n30)

    接下来n行,由01组成的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
    

    说明/提示

    1n30

    具体的做题想法!!!

    这道题和洛谷P1506拯救oibh总部很相似,都是染色的题(搜索)。什么是染色呢,就比如有一片墙,将一个区域围起来,你要做的是把这片区域里的数字/字符全部改成其他东西。

    这种题一般就要用搜索,我一般喜欢用DFS(听说大佬都是DFS加剪枝??)。

    对于这道题,它要求我们把区域内改为数字“2”。表面上看上去外围有“0”,“1”两种数字,但是我们仔细一想,这两种数字其实作用是一样的,都是起到了“墙”的作用。

    所以我们果断把他们都赋值为0,写DFS即可。

    ps:记得在DFS里加入回溯条件和边界条件!不然它会一直跑停不下来!

    代码如下:

     1 #include<iostream>
     2 #include<cstdio>
     3 using namespace std;
     4 int map[50][50],check[50][50],n;
     5 int dy[5]={0,0,0,-1,1};
     6 int dx[5]={0,-1,1,0,0};
     7 void dfs(int x,int y)
     8 {
     9     if(x<0||x>n+1||y<0||y>n+1||check[x][y]!=0)//如果搜过头或者已经被搜过了或者本来就是墙的就往回
    10     return;
    11     check[x][y]=1;
    12     for(int i=1;i<=4;i++)
    13     {
    14         dfs(x+dx[i],y+dy[i]);
    15     }
    16     
    17 }
    18 int main()
    19 {
    20     cin>>n;
    21     for(int i=1;i<=n;i++)
    22     {
    23         for(int j=1;j<=n;j++)
    24         {
    25             cin>>map[i][j];
    26             if(map[i][j]==0)
    27             check[i][j]=0;
    28             else check[i][j]=2;
    29         }
    30     }
    31     dfs(0,0);
    32     for(int i=1;i<=n;i++)
    33     {
    34         for(int j=1;j<=n;j++)
    35         {
    36             if(check[i][j]==0)
    37             {
    38                 cout<<2<<' ';
    39             }
    40             else
    41             cout<<map[i][j]<<' ';
    42         }
    43         cout<<endl;
    44     }
    45     return 0;
    46     
    47 }

     

  • 相关阅读:
    Python+Selenium练习(二十六)- 多窗口之间切换
    Python+Selenium练习(二十五)-执行JavaScript
    Python+Selenium练习(二十四)- 鼠标右键
    Python+Selenium练习(二十三)- 组合键-退格键删除文字
    Python+Selenium练习(二十二)-组合键-全选文字
    Python+Selenium练习(二十一)-获取页面元素大小
    Python+Selenium练习(二十)-验证控件是否被选中
    Python+Selenium练习(十九)-获取元素上面的文字
    Python+Selenium练习(十八)-断言页面标题
    Python+Selenium练习(十七)-自定义浏览窗口大小
  • 原文地址:https://www.cnblogs.com/mo-qian/p/11273841.html
Copyright © 2020-2023  润新知