洛谷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 }

 

 

posted @ 2019-07-31 08:08  陌迁  阅读(190)  评论(0编辑  收藏  举报
Live2D