其他分享
首页 > 其他分享> > 填涂颜色

填涂颜色

作者:互联网

填涂颜色

题目描述

由数字\(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