填涂颜色
作者:互联网
填涂颜色
题目描述
由数字\(0\)组成的方阵中,有一任意形状闭合圈,闭合圈由数字\(1\)构成,围圈时只走上下左右\(4\)个方向。现要求把闭合圈内的所有空间都填写成\(2\).例如:\(6 \times 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 \le n \le 30)\)
接下来\(n\)行,由\(0\)和\(1\)组成的\(n \times n\)的方阵。
方阵内只有一个闭合圈,圈内至少有一个\(0\)。
//感谢黄小U饮品指出本题数据和数据格式不一样. 已修改(输入格式)
输出格式
已经填好数字\(2\)的完整方阵。
样例 #1
样例输入 #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 \le n \le 30\)
思路
拯救oibh总部也是涂色块问题
1)搜索未达1的0的连通块将其染色为3,最后输出时3的部分输出0,0的部分输出2
2)递归结束条件:越界或者遍历到1或者遍历过
需要注意的是以下情况
1 0 0 0 0 0
0 0 1 1 1 1
0 1 0 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1
如果是dfs(1,1)开始遍历那么一开始就会return然后结束,不会成功染色,所以要从dfs(0,0)开始搜索,相当于加了一圈0,这样数组的四条边就会被全遍历到,就能够避免上述情况。并且应当注意越界边界。
代码
#include<iostream>
using namespace std;
int g[40][40];
int n;
int dx[4] = {0,0,1,-1}, dy[4] = {1,-1,0,0};
void dfs(int a, int b) {
if (a<0 || a>n+1 || b<0 || b>n+1 || g[a][b] != 0)return;
//!=0,不能==1因为还有3是遍历过的;注意越界边界是0,n+1
g[a][b] = 3;
for (int i = 0; i < 4; i++) {
int xx = a + dx[i];
int yy = b + dy[i];
dfs(xx, yy);
}
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
cin >> g[i][j];
dfs(0, 0);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (g[i][j] == 3)g[i][j] = 0;
else if (g[i][j] == 0)g[i][j] = 2;
cout << g[i][j] << " ";
}
cout << endl;
}
}
标签:填涂,遍历,颜色,int,dfs,le,涂色,方阵 来源: https://www.cnblogs.com/wxy214/p/16361434.html