首页 > 其他分享 >洛谷 P1162 填涂颜色题解

洛谷 P1162 填涂颜色题解

时间:2024-07-21 11:07:41浏览次数:17  
标签:填涂 le 洛谷 int 题解 闭合 nx ny 方阵

题目链接

填涂颜色

题目描述

由数字 \(0\) 组成的方阵中,有一任意形状的由数字 \(1\) 构成的闭合圈。现要求把闭合圈内的所有空间都填写成 \(2\)。例如:\(6\times 6\) 的方阵(\(n=6\)),涂色前和涂色后的方阵如下:

如果从某个 \(0\) 出发,只向上下左右 \(4\) 个方向移动且仅经过其他 \(0\) 的情况下,无法到达方阵的边界,就认为这个 \(0\) 在闭合圈内。闭合圈不一定是环形的,可以是任意形状,但保证闭合圈内的 \(0\) 是连通的(两两之间可以相互到达)。

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

输入格式

每组测试数据第一行一个整数 \(n(1 \le n \le 30)\)。

接下来 \(n\) 行,由 \(0\) 和 \(1\) 组成的 \(n \times n\) 的方阵。

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

输出格式

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

提示

对于 \(100\%\) 的数据,\(1 \le n \le 30\)。


首先,我们可以看到题目的算法标签是bfs,所以先可以把模版写完

剩下的就不用多说了,直接瀑布填充就行了

话不多说,show me code!

#include<bits/stdc++.h>
using namespace std;
int a[31][31];
int b[31][31];
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};
int n;
struct node
{
	int x, y;
};
void bfs()
{
	int cnt = 1;
	for(int i = 1; i <= n; i++)
	{
		for(int j = 1; j <= n; j++)
		{
			if(!a[i][j] && !b[i][j])
			{
				bool flag = true;
				queue<node> q;
				q.push({i, j});
				b[i][j] = cnt;
				while(!q.empty())
				{
					node t = q.front();
					q.pop();
					for(int k = 0; k < 4; k++)
					{
						int nx = t.x + dx[k], ny = t.y + dy[k];
						//cout << nx << " " << ny << endl;
						if(nx < 1 || nx > n || ny < 1 || ny > n)
						{
							flag = false;
						}
						else if(!(a[nx][ny] || b[nx][ny]))
						{
							q.push({nx, ny});
							b[nx][ny] = cnt;
						}
					}
				}
				//cout << flag << endl;
				if(flag)
				{
					for(int i = 1; i <= n; i++)
					{
						for(int j = 1; j <= n; j++)
						{
							if(b[i][j] == cnt)
							{
								a[i][j] = 2;
							}
						}
					}
				}
				cnt++;
			}
		}
	}
}
int main()
{
	cin >> n;
	for(int i = 1; i <= n; i++)
	{
		for(int j = 1; j <= n; j++)
		{
			cin >> a[i][j];
		}
	}
	bfs();
/*	for(int i = 1; i <= n; i++)
	{
		for(int j = 1; j <= n; j++)
		{
			cout << b[i][j] << " ";
		}
		cout << endl;
	}*/
	for(int i = 1; i <= n; i++)
	{
		for(int j = 1; j <= n; j++)
		{
			cout << a[i][j] << " ";
		}
		cout << endl;
	}
    return 0;
}

标签:填涂,le,洛谷,int,题解,闭合,nx,ny,方阵
From: https://www.cnblogs.com/jackzhang2013/p/18169315

相关文章

  • 题解:Codeforces Round 960 (Div. 2) A
    A.SubmissionBaittimelimitpertest:1secondmemorylimitpertest:256megabytesinput:standardinputoutput:standardoutputAliceandBobareplayingagameinanarray\(a\)ofsize\(n\).Theytaketurnstodooperations,withAlicestarting......
  • 洛谷B3626(跳跃机器人)解析
     这道题的网址洛谷B3626请速览一遍原题当然,咱们来进行题面关键信息提取 1.机器人从第1个格子出发;2.设机器人目前所在格子的编号为x,则它能够跳到格子的编号可能是x,x+1或2x,也就是说,新跳到格子的编号,可能是比原来格子编号少1或多1,或是其2倍;3.不允许跳出界,举个简单的例子......
  • [题解]P4166 [SCOI2007] 最大土地面积
    P4166[SCOI2007]最大土地面积解法\(1\)-\(O(n^2)\)我们运用调整法,可以证明这个四边形的\(4\)个顶点一定都在凸包的顶点上,具体来说:\(\textbf{Proof:}\)首先我们知道,凸包内,到某条直线距离最大的点一定包括\(1\)个顶点。接下来我们考虑一个凸包内的四边形:我们过它的对角......
  • ABC 363 E - Sinking Land 题解
    用一个优先队列维护和海相邻的位置,每次海面上升就判断一下队列中海拔最低的那个位置会不会被淹没,如果会,就删除,同时它上下左右的位置也是和海相邻的(或者就在海里),把它们加进优先队列里,记得判断一下加入的格子曾经有没有被加入过队列,不要加重复了。点击开DconstintN=1099;int......
  • ABC 363 F - Palindromic Expression 题解
    下文中提到的数字都不包含0,注意把含0的数字特判掉。反转指各个数位倒过来,比如114514反转过后就是415411。注意到,答案一定是这样:数列\(a\)的各个数字相乘,乘以一个回文,再把数列\(a\)倒过来,每个数反转,再相乘。比如:2*57*184481*75*2,其中的数列\(a\)就是:257,中间的回文......
  • Python学习笔记39:进阶篇(二十八)pygame的使用之按键映射及按键失效问题解决
    前言基础模块的知识通过这么长时间的学习已经有所了解,更加深入的话需要通过完成各种项目,在这个过程中逐渐学习,成长。我们的下一步目标是完成pythoncrashcourse中的外星人入侵项目,这是一个2D游戏项目。在这之前,我们先简单学习一下pygame模块。私信我发送消息python资料,......
  • CF819B Mister B and PR Shifts 题解
    题目传送门前置知识权值树状数组及应用解法由[ABC351F]DoubleSum的套路,尝试展开绝对值及\(\min,\max\)。将式子拆开有\(\begin{aligned}&\min\limits_{k=0}^{n-1}\{\sum\limits_{i=1}^{n-k}|a_{i}-(i+k)|+\sum\limits_{i=n-k+1}^{n}|a_{i}-(i-(n-k))|\}\\&=\min......
  • WebGoC题解(11) 627.传声(2019NHOI小乙)
    题目描述 小C节日旅游来到一个农场。农场主John和n个奶牛站在一条水平线上。牛的传递消息是依靠“吼”,牛的吼叫声最远可以传递的距离是50。农场主John首先通知最左边的第一条奶牛(一定会通知),然后奶牛就开始向后吼叫,后面的奶牛如果能听到(和前面吼叫的奶牛距离不超过50),就继续向......
  • 2064:【例2.1】交换值 题解
    题目链接题目描述输入两个正整数\(a\)和\(b\),试交换\(a\)、\(b\)的值(使\(a\)的值等于\(b\),\(b\)的值等于\(a\))。解题思路该题有很多种方法,例如:直接输出\(b\)和\(a\)(偷鸡方法)使用algorithm库的swap函数使用额外变量辅助位运算\(......\)但这道题目放在"运算符和表达式"......
  • CF906C Party题解
    今天来水一波题解……理解题意由于题目意思讲得很清楚,就因为懒惰直接复制了……给你一堆一对对的关系,然后每一个关系对代表两个人认识。然后你每次可以选择一个人i,让i认识的所有人都相互认识,即i把介绍自己所有的朋友给其他人。然后现在问你最少需要选择多少个这样的i,使得所有的......