P1162 填涂颜色题解

2024-02-28 01:36
文章标签 题解 颜色 填涂 p1162

本文主要是介绍P1162 填涂颜色题解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

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

如果从某个0出发,只向上下左右4个方向移动且仅经过其他 00 的情况下,无法到达方阵的边界,就认为这个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≤n≤30)。

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

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

输出格式

已经填好数字2的完整方阵。

输入输出样例

输入样例

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

解析

本来大家看到此题目想的应该都是“如何将包围圈内的染成2”,但其实更方便的做法是“ 将0都染成2,再将暴露在闭合圈外的2染回0 ”。

关键问题在于如何bfs

如果按照常规从(1,1)开搜的话,会被“与边框重合的闭合圈”卡住。因为程序无法正常搜索,或只能搜索一部分,如下情况

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

如果按正常方式搜索的话,会只有左上角的三个0,左上角及左下右下的2均没有变回0。

所以说要像这样,将矩阵外留一圈,方便搜索。

x x x x x x x x
x 0 0 0 0 0 0 x
x 0 0 1 1 1 1 x
x 0 1 1 0 0 1 x
x 1 1 0 0 0 1 x
x 1 0 0 0 0 1 x
x 1 1 1 1 1 1 x
x x x x x x x x

(x为留出的外圈边框,上边框在二维数组中纵坐标为0,下边框纵坐标为n+1,左边框在二维数组中横坐标为0,右边框横坐标为n+1)

在运行中,我们把边框和所有0都赋值为2,像这样

2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2
2 2 2 1 1 1 1 2
2 2 1 1 2 2 1 2
2 1 1 2 2 2 1 2
2 1 2 2 2 2 1 2
2 1 1 1 1 1 1 2
2 2 2 2 2 2 2 2

再从(0,0)开始搜索,将圈外0赋值为2即可完成答案(别把用于搜索的外圈一块输入了)

#include<iostream>
#include<queue>
using namespace std;
int n,dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
int a[32][32];
queue<pair<int,int> >q;
int main(){cin>>n;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){cin>>a[i][j];}}for(int i=0;i<=n+1;i++){for(int j=0;j<=n+1;j++){if(a[i][j]==0){a[i][j]=2;}}}q.push(make_pair(0,0));while(!q.empty()){int x=q.front().first,y=q.front().second;q.pop();a[x][y]=0;for(int i=0;i<4;i++){if(a[x+dx[i]][y+dy[i]]==2){q.push(make_pair(x+dx[i],y+dy[i]));}}}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){cout<<a[i][j]<<' ';}cout<<endl;}
}

其中,pair主要的作用是将两个数据组合成一个数据,两个数据可以是同一类型或者不同类型。
例如pair<int,float>或者pair<double,double>等。pair实质上是一个结构体,其主要的两个成员变量是first和second,这两个变量可以直接使用。初始化一个pair可以使用构造函数,也可以使用make_pair函数,make_pair函数的定义如下:

template pair make_pair(T1 a, T2 b) { return pair(a, b); }

一般make_pair都使用在需要pair做参数的位置,可以直接调用make_pair生成pair对象。

另一个使用的方面就是pair可以接受隐式的类型转换,这样可以获得更高的灵活度。但是这样会出现如下问题:例如有如下两个定义:

pair<int, float>(1, 1.1);
make_pair(1, 1.1);

其中第一个的second变量是float类型,而make_pair函数会将second变量都转换成double类型。

这篇关于P1162 填涂颜色题解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/754112

相关文章

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

C - Word Ladder题解

C - Word Ladder 题解 解题思路: 先输入两个字符串S 和t 然后在S和T中寻找有多少个字符不同的个数(也就是需要变换多少次) 开始替换时: tips: 字符串下标以0开始 我们定义两个变量a和b,用于记录当前遍历到的字符 首先是判断:如果这时a已经==b了,那么就跳过,不用管; 如果a大于b的话:那么我们就让s中的第i项替换成b,接着就直接输出S就行了。 这样

【秋招笔试】9.07米哈游秋招改编题-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集 100+ 套笔试题,笔试真题 会在第一时间跟新 🍄 题面描述等均已改编,如果和你笔试题看到的题面描述

LeetCode 第414场周赛个人题解

目录 Q1. 将日期转换为二进制表示 原题链接 思路分析 AC代码 Q2. 范围内整数的最大得分 原题链接 思路分析 AC代码 Q3. 到达数组末尾的最大得分 原题链接 思路分析 AC代码 Q4. 吃掉所有兵需要的最多移动次数 原题链接 思路分析 AC代码 Q1. 将日期转换为二进制表示 原题链接 Q1. 将日期转换为二进制表示 思路分析

渐变颜色填充

GradientFill函数可以对特定的矩形区域或者三角形区域进行渐变颜色的填充。我们先来看看GradientFill函数到底长得什么样子,帅不帅。 [cpp]  view plain copy print ? BOOL GradientFill(     _In_  HDC hdc,     _In_  PTRIVERTEX pVertex,     _In_  ULONG

牛客小白月赛100部分题解

比赛地址:牛客小白月赛100_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ A.ACM中的A题 #include<bits/stdc++.h>using namespace std;#define ll long long#define ull = unsigned long longvoid solve() {ll a,b,c;cin>>a>>b>

P2858 [USACO06FEB] Treats for the Cows G/S 题解

P2858 题意 给一个数组。每天把最左或者最右的东西卖掉,第 i i i个东西,第 d a y day day天卖出的价格是 a [ i ] ∗ d a y a[i]*day a[i]∗day。 记忆化搜索 void dfs(int l,int r,int day,ll sum){if(v[l][r]>=sum)return;v[l][r]=sum;if(l>r)//这就是dp答案{

【虚拟机/服务器】非图形化界面下修改Shell中颜色的设置

1、首先 cd ~ && ll 可以看到如下图所示 2、输入 sudo vim .bashrc 进入 .bashrc 并通过 /PS1 迅速从上往下定位第一个PS1 3、输入 i 进入插入模式后修改 else 下面的配置如下 说明:\e[1;32;40m] 其中1表示高亮显示,32表示字体颜色是绿色,40表示背景色为黑色 4、输入 esc 退出编辑模式到命令模式,再输入

【C++题解】1272. 郭远摘苹果

欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP-J)》 问题:1272. 郭远摘苹果 类型:二维数组 题目描述: 郭远有一天走到了一片苹果林,里面每颗树上都结有不同数目的苹果,郭远身上只能拿同一棵树上的苹果,他每到一棵果树前都会把自己身上的苹果扔掉并摘下他所在树上的苹果并带走(假设郭远会走过每一棵苹果树),问在郭远摘苹果的整个过程中,他身上携带的最多苹果数与最小苹果数的差是多少?