填涂颜色(洛谷)

题目

原题

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

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

思路

这里的方法是bfs。如果知道闭合圈内其中某一个点,就可以直接bfs,但问题是无法知道哪个点在闭合圈内。这里可以反其道而行之。找非闭合圈的点,显然只要找到一个闭合圈外的点利用bfs就可以找到所有闭合圈外的点,把这些点涂成2。这样把所有不在闭合圈内的点都涂成2(或者其他非1的任意数字,代码是9)后,点的值等于0的就是闭合圈。问题是如何找到这样的点,因为大多数都有概率是圈内的点(边界的点有可能是1).
这里采取的方法是在给定数据外面用一圈0围绕,这样最外面的0一定不是圈内的点。并且这里用一圈0围绕还有一个作用就是避免有些边界的点因为被1包围而无法被bfs搜索到。例如这样一段数据

6
0 0 1 1 1 0
1 1 1 0 1 0
1 0 0 0 0 1
1 1 1 1 1 1
0 1 0 1 0 0
1 1 1 1 0 0

这里左上角的两0,如果直接bfs是无法搜到。但是如果在外边围一圈0,这样就可以搜到。

代码

#include<bits/stdc++.h>
using namespace std;
int a[100][100];
int n;
int dx[5]={-1,1,0,0};
int dy[5]={0,0,-1,1};void bfs(int x,int y){queue<pair<int,int> > q;q.push(make_pair(x,y));pair<int,int> temp;while(!q.empty()){temp=q.front();for(int i=0;i<4;i++){//越界检查,外面围了一圈0,因为是小于等于n+1if(temp.first+dx[i]>=0&&temp.first+dx[i]<=n+1&&temp.second+dy[i]<=n+1&&temp.second+dy[i]>=0)//检查该方向是否可行		if(a[temp.first+dx[i]][temp.second+dy[i]]==0){a[temp.first+dx[i]][temp.second+dy[i]]=9;q.push(make_pair(temp.first+dx[i],temp.second+dy[i]));}}q.pop();}
}int main(){cin>>n;//输入for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){cin>>a[i][j];}}//bfsbfs(0,0);//输出for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){//等于9说明是圈外的点,因为被填涂了if(a[i][j]==9)cout<<0;else if(a[i][j]==1)cout<<1;//没被填涂说明是圈内点。else if(a[i][j]==0)cout<<2;if(j<n)cout<<' ';elsecout<<endl;}}} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/744100.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【更新】上市公司“宽带中国”战略数据集(2000-2022年)

参照李万利&#xff08;2022&#xff09;、薛成&#xff08;2020&#xff09;等人的做法&#xff0c;根据企业所在城市入选“宽带中国”试点战略的批次构建DID。如果样本期间内企业所在城市被评选为“宽带中国” 试点城市&#xff0c;则该地区企业样本在入选当年及以后年份取1&…

video标签的src和srcObject属性的区别

在HTML的<video>标签中&#xff0c;src和srcObject是两个不同的属性。 src属性&#xff1a;用于指定视频资源的URL。可以通过设置该属性来指定一个视频文件的路径或者网络地址&#xff0c;例如 <video src"video.mp4"></video> 通过设置src属性&a…

打卡学习kubernetes——了解k8s基本概念

目录 1 Container 2 Pod 3 Node 4 Namespace 5 Service 6 Label 7 Annotations 8 Volume 1 Container Container(容器)是一种便携式、轻量级的操作系统级虚拟化技术。它使用namespace隔离不同的软件运行环境&#xff0c;并通过镜像自包含软件的运行环境&#xff0c;从而…

计算机二级真题讲解每日一题:《高校分类》

描述‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬ 修改编程模板&#xff0c;用…

Focal and Global Knowledge Distillation forDetectors

摘要 文章指出&#xff0c;在目标检测中&#xff0c;教师和学生在不同领域的特征差异很大&#xff0c;尤其是在前景和背景中。如果我们 平等地蒸馏它们&#xff0c;特征图之间的不均匀差异将对蒸馏产生负面影响。因此&#xff0c;我们提出了局部和全局蒸馏。局部蒸馏分离前景和…

【Spring Boot系列】快速上手 Spring Boot

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

C语言(数组)单元练习二

单项选择题 1. A. float f[3,4]&#xff1b; B. int a[ ][4]&#xff1b; C. char c(3)&#xff1b; D. double d[32][4]&#xff1b; 2. 一维数组初始化时,若对部分数组元素赋初值,则下面正确的说法是______。 A. 可以只对数组的前几个元素赋初值 B. 可以只对数…

macOS - 获取硬件设备信息

文章目录 1、CPU获取方式 一&#xff1a; system_profiler获取方式二&#xff1a;sysctl&#xff0c; machdepmachdep 2、内存3、硬盘4、显卡5、声卡6、光驱7、系统序列号8、型号标识符9、UUID 等信息 10. 计算机名称 1、CPU 获取方式 一&#xff1a; system_profiler % syst…

深信服技术认证“SCCA-C”划重点:深信服应用交付AD

为帮助大家更加系统化地学习云计算知识&#xff0c;高效通过云计算工程师认证&#xff0c;深信服特推出“SCCA-C认证备考秘笈”&#xff0c;共十期内容。“考试重点”内容框架&#xff0c;帮助大家快速get重点知识 划重点来啦 *点击图片放大展示 深信服云计算认证&#xff08;S…

中国工程精英智创数字工厂——2023纵览基础设施大会暨光辉大奖赛观察 (下)

中国工程精英智创数字工厂 ——2023纵览基础设施大会暨光辉大奖赛观察 &#xff08;下&#xff09; 吴付标 中国制造的尽头是智能化、智慧化&#xff0c;这一趋势正在加速前进。2022年&#xff0c;中国以50座达沃斯论坛盖章认证的“灯塔工厂”数量冠绝全球&#xff0c;而“数…

活动预告:如何培养高质量应用型医学人才?

在大数据时代与“新医科”建设的背景下&#xff0c;掌握先进的医学数据处理技术成为了医学研究与应用的重要技能。 为了更好地培养社会所需要的高质量应用型医学人才&#xff0c;许多高校已经在广泛地开展面向医学生的医学数据分析教学工作。 在“课-训-赛”育人才系列活动的…

详解Python中%r和%s的区别及用法

首先看下面的定义&#xff1a; %r用rper()方法处理对象 %s用str()方法处理对象 函数str() 用于将值转化为适于人阅读的形式&#xff0c;而repr() 转化为供解释器读取的形式&#xff08;如果没有等价的语法&#xff0c;则会发生SyntaxError 异常&#xff09; 某对象没有适于人…

Spring Data访问 MongoDB(十五)----MongoDB特有的数据操作方法

【Spring连载】使用Spring Data访问 MongoDB&#xff08;十五&#xff09;----MongoDB特有的数据操作方法 一、更新方法二、删除方法 除了 查询方法之外&#xff0c;还可以使用专门的方法更新数据。 一、更新方法 你还可以使用上表中的关键字创建查询&#xff0c;以标识匹配的…

rust 阿里云oss操作

在rust中如何操作阿里云oss文件&#xff0c;阿里云官方并没有提供这样的sdk&#xff0c;我们可以使用社区的aliyun-oss-rust-sdk库crate来实现。 功能列表 文件下载签名下载签名上传获取上传对象的policy上传本地文件上传内存文件文件删除 添加依赖 [dependencies] # 异步 a…

面试常问:为什么 Vite 速度比 Webpack 快?

前言 最近作者在学习 webpack 相关的知识&#xff0c;之前一直对这个问题不是特别了解&#xff0c;甚至讲不出个123....&#xff0c;这个问题在面试中也是常见的&#xff0c;作者在学习的过程当中总结了以下几点&#xff0c;在这里分享给大家看一下&#xff0c;当然最重要的是…

面试六--TCP粘包问题

1.流式传输协议 流式传输协议&#xff08;Streaming Protocol&#xff09;是一种用于在网络上传输数据的通信协议&#xff0c;它允许数据以连续的流的形式进行传输&#xff0c;而不是一次性发送完整的数据包。流式传输协议即协议的内容是像流水一样的字节流&#xff0c;内容与内…

如何使用vue定义组件之——全局or局部

在Vue中定义一个组件&#xff0c;您需要使用Vue.component()方法来全局注册组件&#xff0c;或者在Vue实例的选项中局部注册组件&#xff0c;以下是一个具体的步骤&#xff1f; 1.全局注册组件&#xff1a; 使用Vue.component()方法来注册一个全局组件&#xff0c;这意味着这个…

Flutter第三弹:常用的Widget

目标&#xff1a; 1&#xff09;常用的Widget有哪些&#xff1f;有什么特征&#xff1f; 2&#xff09;开发一个简单的登录页面。 一、Flutter常用Widget 对于Flutter来说&#xff0c;一切皆Widget. 常用的Widget&#xff0c;包括一些基础功能的Widget. 控件名称功能备注…

代码随想录day19(2)二叉树:二叉树的最大深度(leetcode104)

题目要求&#xff1a;求出二叉树的最大深度 思路&#xff1a;首先要区分二叉树的高度与深度。二叉树的高度是任一结点到叶子结点的距离&#xff0c;而二叉树的深度指的是任一节点到根节点的距离&#xff08;从1开始&#xff09;。所以求高度使用后序遍历&#xff08;从下往上&…

【小白学机器学习9】自己纯手动计算验证,EXCEL的一元线性回归的各种参数值

目录 0 目标 1 构造模型 1.1 构造模型的思路 1.2 具体模型构造的EXCEL公式和过程 2 直接用EXCEL画图&#xff0c;然后生成趋势线的方式进行回归分析 2.1 先选择“观测值Y”的数据&#xff0c;用散点图或者折线图作图 2.2 然后添加趋势线和设置趋势线格式 2.3 生成趋…