ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

填涂颜色

2022-06-09 22:34:00  阅读:158  来源: 互联网

标签:填涂 遍历 颜色 int dfs le 涂色 方阵


填涂颜色

题目描述

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有