洛谷 1162 填涂颜色 (dfs,染色法)

题目描述

由数字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行,由0和1组成的n×n的方阵。

方阵内只有一个闭合圈,圈内至少有一个00。

//感谢黄小U饮品指出本题数据和数据格式不一样. 已修改(输入格式)

输出格式:

已经填好数字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

说明

1n30

染色法:

 

 1 #include<stdio.h>
 2 int n,Map[32][32],a[32][32],dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
 3 void dfs(int x,int y){
 4     if(x<0||x>n+1||y<0||y>1+n||Map[x][y]!=0) //考虑第一排都是1,如果范围不是这样的,那就算后面符合,也直接return了
 5         return;
 6     Map[x][y]=1;//染色
 7     for(int i=0;i<4;i++){
 8         dfs(x+dir[i][0],y+dir[i][1]);
 9     }
10 }
11 
12 int main(){
13     while(scanf("%d",&n)!=EOF){
14         for(int i=1;i<=n;i++){
15             for(int j=1;j<=n;j++){
16                 scanf("%d",&a[i][j]);
17                 if(a[i][j]==0) 
18                     Map[i][j]=0;
19                 else 
20                     Map[i][j]=1;
21             }
22         }
23         dfs(0,0);
24         for(int i=1;i<=n;i++){
25             for(int j=1;j<=n;j++){
26                 if(Map[i][j]==0)//如果全部染完色了还是0,那它就被包围起来了
27                     printf("2 ");
28                 else
29                     printf("%d ",a[i][j]);//按照原来的样子输出
30             }
31             printf("
");
32         }
33     }
34     return 0;
35 }
原文地址:https://www.cnblogs.com/cake-lover-77/p/10301774.html