【C++BFS】959. 由斜杠划分区域

news2025/1/10 20:50:45

本文涉及知识点

C++BFS算法

LeetCode959. 由斜杠划分区域

在由 1 x 1 方格组成的 n x n 网格 grid 中,每个 1 x 1 方块由 ‘/’、‘’ 或空格构成。这些字符会将方块划分为一些共边的区域。
给定网格 grid 表示为一个字符串数组,返回 区域的数量 。
请注意,反斜杠字符是转义的,因此 ‘’ 用 ‘\’ 表示。
示例 1:
在这里插入图片描述

输入:grid = [" /“,”/ "]
输出:2
示例 2:

在这里插入图片描述

输入:grid = [" /“,” "]
输出:1
示例 3:

输入:grid = [“/\”,“\/”]
输出:5
解释:回想一下,因为 \ 字符是转义的,所以 “/\” 表示 /\,而 “\/” 表示 /。

提示:
n == grid.length == grid[i].length
1 <= n <= 30
grid[i][j] 是 ‘/’、‘’、或 ’ ’

题解

任意单格内部分四块,上下左右单格内编号分别为0,1,2,3。
在这里插入图片描述

如果此单格是空格,则0,1,2,3相连。
如果此空格是斜杠,则0,2 相连,1,3向量。
如果是反斜杠,则0,3相连,1,2相连。
各的编号:4*(r*n+c)+单格内编号。
可以直接用并集查找(并查集)计算连通区域,本文用BFS。

C++BFS

编号从小到大枚举各块,如果不属于任意区域,则将此块及相连的区域划分到cnt区域,并cnt++。
region[i]记录第i块,在那个区域,默认值-1,表示不属于任何区域。
neiBo是各块的邻接表。
BFS的状态表示:leves[i]记录和root通过i条边相连的块。
BFS的后续状态:通过next枚举neiBo[cur]
BFS的初始值:leves[0]={root}
BFS的返回值:无。
BFS的重复处理:利用region出重。
必须判断上一行是否存在,不能只判断编号是否n合法:
n=2时,块10的左边不存在,如果不判断c>0,则块10和块7连通。

代码

核心代码

class Solution {
		public:
			int regionsBySlashes(vector<string>& grid) {
				const int N = grid.size();
				const int N1 = N * N * 4;
				vector<vector<int>> vNeiBo(N1);
				auto Add = [&vNeiBo,&N1](int n1, int n2) {
					if ((n1 < 0) || (n1 >= N1)) { return; }
					if ((n2 < 0) || (n2 >= N1)) { return; }
					vNeiBo[n1].emplace_back(n2);
					vNeiBo[n2].emplace_back(n1);
				};
				//单格内部连接
				for (int r = 0; r < N; r++) {
					for (int c = 0; c < N; c++) {
						const int iBase = 4 * (N * r + c);
						if ('\\' != grid[r][c]) {
							Add(iBase, iBase + 2);
							Add(iBase+1, iBase + 3);
						}
						if ('/' != grid[r][c]) {
							Add(iBase, iBase + 3);
							Add(iBase + 1, iBase + 2);
						}
					}
				}
				//单格间连接
				for (int r = 0; r < N; r++) {
					for (int c = 0; c < N; c++) {
#define Mask(r,c,n) ((N*(r)+(c))*4+(n))
						if (r > 0)
						{
							Add(Mask(r, c, 0), Mask(r - 1, c, 1));//本行上 上一行下
						}
						if (r + 1 < N)
						{
							Add(Mask(r, c, 1), Mask(r + 1, c, 0));//本行下 下一行上
						}
						if (c > 0)
						{
							Add(Mask(r, c, 2), Mask(r, c - 1, 3));//本行左 左列右
						}
						if (c + 1 < N)
						{
							Add(Mask(r, c, 3), Mask(r, c + 1, 2));//本行右 右列左
						}
					}
				}

				vector<int> region(N1, -1);
				int cnt = 0;
				for (int i = 0; i < N1; i++) {
					if (-1 != region[i]) { continue; }
					queue<int> que;
					que.emplace(i);
					region[i] = cnt;
					while (que.size()) {
						auto cur = que.front();
						que.pop();
						for (const auto& next : vNeiBo[cur]) {
							if (-1 != region[next]) { continue; }
							region[next] = cnt;
							que.emplace(next);
						}
					}
					cnt++;
				}
				return cnt;
			}
		};

单元测试

vector<string> grid;
		TEST_METHOD(TestMethod1)
		{
			grid = { " " };
			auto res = Solution().regionsBySlashes(grid);
			AssertEx(1, res);
		}
		TEST_METHOD(TestMethod2)
		{
			grid = { "/" };
			auto res = Solution().regionsBySlashes(grid);
			AssertEx(2, res);
		}
		TEST_METHOD(TestMethod3)
		{
			grid = { "\\" };
			auto res = Solution().regionsBySlashes(grid);
			AssertEx(2, res);
		}
		TEST_METHOD(TestMethod11)
		{
			grid = { " /","/ " };
			auto res = Solution().regionsBySlashes(grid);
			AssertEx(2, res);
		}
		TEST_METHOD(TestMethod12)
		{
			grid = { " /","  " };
			auto res = Solution().regionsBySlashes(grid);
			AssertEx(1, res);
		}
		TEST_METHOD(TestMethod13)
		{
			grid = { "/\\","\\/" };
			auto res = Solution().regionsBySlashes(grid);
			AssertEx(5, res);
		}

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

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

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

相关文章

整理压缩JavaScript文件

你是不是会担心有专业人员通过你写的JavaScript语法来判断你的接口数据&#xff0c;今天就介绍一种可以封装你写的JavaScript的工具 环境&#xff1a;Windows10、node20.11.1、Vue/cli 5.0.8 uglify-js 是一个流行的 JavaScript 压缩工具&#xff0c;用于减少 JavaScript 文件…

angular入门基础教程(二)第一个angular组件

ng中的语法跟vue中是一样的插值语法&#xff0c;其实也是早期vue抄的ng的思路&#xff0c;使用{{variable}}形式&#xff0c;vue借鉴了ng和react&#xff0c;这个我们就不多了。 新建一个子组件 在项目根目录下面&#xff0c;执行 ng g component ./components/UserList这样…

Transformer——逐步详解架构和完整代码搭建

好久没更新博客&#xff0c;后面更新会勤一些。今天想聊一下Transformer&#xff0c;Transformer在NLP和CV领域都有着重要的价值&#xff0c;甚至可以看作是一个基础模型&#xff0c;这篇博客将通过详细代码深入解析Transformer模型总体架构图各个部分的的作用和搭建:论文链接&…

angular入门基础教程(九)依赖注入(DI)

依赖注入 Angular 中的依赖注入&#xff08;DI&#xff09;是框架最强大的特性之一。可以将依赖注入视为 Angular 在运行时为你的应用 提供所需资源的能力。依赖项可以是服务或其他资源。 使用服务的一种方式是作为与数据和 API 交互的方式。为了使服务可重用&#xff0c;应该…

晋升有望,5本易录用的计算机三四区潜力刊,通过率>50%,2个月超速接收,好发

今天模术狮给大家整理了5本让你晋升有望&#xff01;易录用的计算机三区四区潜力刊&#xff0c;通过率&#xff1e;50%&#xff0c;2个月超速接收&#xff0c;好发&#xff01; 1 DATA MINING AND KNOWLEDGE DISCOVERY 期刊简介&#xff1a;数据收集、存储和分发方面的进步产生…

Qt系统机制

Qt系统 Qt文件概述输入输出设备类QFileQFileInfoQt多线程Qt多线程常用API使用Qt多线程 线程安全互斥锁读写锁条件变量信号量 Qt网络QUdpSocketQNetworkDatagram设计一个UDP回显服务器QTcpServerQTcpSocketTcp版本的回显服务器HttpClient核心API Qt 音频Qt视频 Qt文件概述 ⽂件操…

阿里云服务器系统盘扩容后,宝塔面板不显示新容量的问题

1. 安装 growpart 扩展 yum install -y cloud-utils-growpart 2. 运行fdisk -l命令查看磁盘实际大小。 fdisk -l 用于:查看磁盘实际大小 说明:磁盘(/dev/vda)实际大小为:250 G。 3. 运行df -h命令查看磁盘分配大小。 df -h 用于:查看磁盘分配大小 4. 自适应分区扩容 g…

2024 Navicat Premium最新版简体中文版破解激活永久图文详细教程(亲测可用)

1.官网下载&#xff1a;下载地址 2.百度网盘下载&#xff1a;下载地址 3.未安装过的用户可直接跳过该步骤&#xff0c;如果已安装Navicat&#xff0c;记得先卸载干净&#xff0c;防止破解失效&#xff0c;卸载完成后执行补丁压缩包中的Navicat.bat脚本&#xff08;一闪而过表示…

热门景区精准客流统计也能如此简单做到了

在热门景区&#xff0c;游客如织&#xff0c;如何实现精准的客流统计成为了景区管理者关注的重点。令人欣喜的是&#xff0c;如今这一难题已经有了简单而有效的解决方案。 一、景区应用客流统计的原因 首先&#xff0c;热门景区承载着巨大的游客流量&#xff0c;为了确保游客的…

如何使用git拉取gitee上面的项目/代码?(超简单)

一、下载git软件 下载地址&#xff1a;git官网地址 1.点击右边小电脑上的按钮下载 2.选择自己电脑对应的系统 3.基本都是默认&#xff0c;这里需要勾一下就ok 4.正在安装 2.使用git软件 1.如何打开git 找到你想要操作的文件夹&#xff0c;右击open git bash here就可以…

云计算实训16——关于web,http协议,https协议,apache,nginx的学习与认知

一、web基本概念和常识 1.Web Web 服务是动态的、可交互的、跨平台的和图形化的为⽤户提供的⼀种在互联⽹上浏览信息的服务。 2.web服务器&#xff08;web server&#xff09; 也称HTTP服务器&#xff08;HTTP server&#xff09;&#xff0c;主要有 Nginx、Apache、Tomcat 等。…

【参会邀请】第四届区块链技术与信息安全国际会议(ICBCTIS 2024)诚邀相聚江城!

我们诚挚地邀请您参与第四届区块链技术与信息安全国际会议&#xff08;ICBCTIS 2024&#xff09;。本届会议将于2024年8月17日~19日在中国武汉召开。会议将围绕区块链技术与信息安全等相关研究领域&#xff0c;特邀国内外数位在此领域学术卓越的学者专家做相关致辞与报告&#…

一行Python代码实现神奇效果:创意编程实例

文末赠免费精品编程资料~~ 1. 基础中的魔法&#xff1a;打印艺术 目标&#xff1a;用一行代码打印出一个简单的图案&#xff0c;比如心形。 print( .join([**i for i in range(1, 6)] [ *4] [**i for i in range(5, 0, -1)]))解析&#xff1a; 我们利用列表推导式生成两部…

Halcon深度学习分类模型

1.Halcon20之后深度学习支持CPU训练模型&#xff0c;没有money买显卡的小伙伴有福了。但是缺点也很明显&#xff0c;就是训练速度超级慢&#xff0c;推理效果也没有GPU好&#xff0c;不过学习用足够。 2.分类模型是Halcon深度学习最简单的模型&#xff0c;可以用在物品分类&…

说真的,内裤袜子丢进洗衣机比手洗好!内裤袜子洗衣机推荐

内裤和袜子作为日常生活中不可或缺的贴身衣物&#xff0c;其清洁卫生尤为重要&#xff0c;但频繁的洗涤工作往往令人感到繁琐。正是因为这一清洗需求&#xff0c;内裤袜子洗衣机应运而生&#xff0c;它不仅为我们的生活带来了便利&#xff0c;更体现了对个人卫生和生活品质的重…

货拉拉论文入选亚太消费者研究会议及亚太营销国际学术会议

近日,亚太消费者研究会议(AP-ACR)召开。本次会议上,货拉拉和香港中文大学合作就论文《Why Showing Multiple Options Simultaneously Makes Customers Less Picky》(《为什么同步显示多个选项会使消费者变得更不挑剔》)进行主题报告。此前,本篇论文也曾在第二届亚太营销国际学术…

libevent入门篇

文章目录 概述下载编译目录samplehello-world初始化创建监听器处理连接处理信号 build 小结 概述 libevent 和 libev 都是由 c 实现的异步事件库&#xff1b;注册异步事件&#xff0c;检测异步事件&#xff0c;根据事件的触发先 后顺序&#xff0c;调用相对应回调函数处理事件…

命令行使用ADB,不用root,完美卸载小米预装软件

ADB安装与运行 install java 下载安装 注意选择JDK17以上版本 https://www.oracle.com/java/technologies/downloads/#jdk22-windows 选择中间的安装文件下载 编辑系统变量 C:\Program Files (x86)\Java\jdk-22 C:\Program Files (x86)\Java\jdk-22\bin 把C:\Progra…

YOLOv9训练完成后的权重文件夹中绘制的图像和txt,val_loss一直为0

现象&#xff1a; 在利用YOLOv9源码进行模型训练的时候&#xff0c;在训练完成后&#xff0c;权重文件夹中的图像和txt文件&#xff0c;val_loss一直为0。 原因&#xff1a; 在训练过程中&#xff0c;为计算验证的loss 修改&#xff1a; 在val_dual.py的197行&#xff0c;将原…