洛谷—— P1162 填涂颜色

https://www.luogu.org/problem/show?pid=1162

题目描述

由数字0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向。现要求把闭合圈内的所有空间都填写成2.例如:6X6的方阵(n=6),涂色前和涂色后的方阵如下:

0 0 0 0 0 0 0 0 0 0 0 0

0 0 1 1 1 1 0 0 1 1 1 1

0 1 1 0 0 1 0 1 1 2 2 1

1 1 0 0 0 1 1 1 2 2 2 1

1 0 0 0 0 1 1 2 2 2 2 1

1 1 1 1 1 1 1 1 1 1 1 1

输入输出格式

输入格式:

每组测试数据第一行一个整数:n。其中n(1<=n<=30)

接下来n行,由0和1组成的nXn的方阵。

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

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

输出格式:

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

 1 #include <algorithm>
 2 #include <cstdio>
 3 
 4 using namespace std;
 5 
 6 int n,num[31][31];
 7 bool mark[31][31];
 8 int fx[4]={0,0,1,-1};
 9 int fy[4]={1,-1,0,0};
10 
11 void BFS(int x,int y)
12 {
13     mark[x][y]=1;
14     for(int i=0;i<4;i++)
15     {
16         int xx=x+fx[i],yy=y+fy[i];
17         if(mark[xx][yy]||num[xx][yy]==1) continue;
18         if(xx<0||yy<0||xx>n||yy>n) continue;
19         BFS(xx,yy);
20     }
21 }
22 
23 int main()
24 {
25     scanf("%d",&n);
26     for(int i=1;i<=n;i++)
27       for(int j=1;j<=n;j++)
28           scanf("%d",&num[i][j]);
29     for(int i=1;i<=n;i++)
30     {
31         if(num[1][i]==0) BFS(1,i);
32         if(num[n][i]==0) BFS(n,i); 
33         if(num[i][1]==0) BFS(i,1);
34         if(num[i][n]==0) BFS(i,n);
35     }
36     for(int i=1;i<=n;i++)
37     {
38         for(int j=1;j<=n;j++)
39             if(mark[i][j]&&num[i][j]==0) printf("%d ",0);
40             else if(num[i][j]==0) printf("%d ",2);
41             else printf("%d ",num[i][j]);
42         printf("
");
43     }
44     return 0;
45 }
——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
原文地址:https://www.cnblogs.com/Shy-key/p/7128621.html