【C++BFS】1020. 飞地的数量

news2025/1/10 16:50:37

本文涉及知识点

C++BFS算法

LeetCode1020. 飞地的数量

给你一个大小为 m x n 的二进制矩阵 grid ,其中 0 表示一个海洋单元格、1 表示一个陆地单元格。
一次 移动 是指从一个陆地单元格走到另一个相邻(上、下、左、右)的陆地单元格或跨过 grid 的边界。
返回网格中 无法 在任意次数的移动中离开网格边界的陆地单元格的数量。
示例 1:

在这里插入图片描述

输入:grid = [[0,0,0,0],[1,0,1,0],[0,1,1,0],[0,0,0,0]]
输出:3
解释:有三个 1 被 0 包围。一个 1 没有被包围,因为它在边界上。
示例 2:

在这里插入图片描述

输入:grid = [[0,1,1,0],[0,0,1,0],[0,0,1,0],[0,0,0,0]]
输出:0
解释:所有 1 都在边界上或可以到达边界。

提示:

m == grid.length
n == grid[i].length
1 <= m, n <= 500
grid[i][j] 的值为 0 或 1

BFS

统计1的数量cnt1,将能够到达边界的1放到v中。返回值:cnt1-v.size()。
BFS的状态表示:leves[i]记录通过i个陆地单格可以到达边界的陆地单格。
BFS的后续状态:通过vNeiBo[r][c]枚举和(r,c)相邻且为1的单格。
BFS的初始状态:边界上的单格。
BFS的返回值:无。
BFS出重处理:二维数组出重。

源码

核心源码

class Solution {
		public:
			int numEnclaves(vector<vector<int>>& grid) {
				m_r = grid.size();
				m_c = grid[0].size();
				vector<vector<pair<int,int>>> neiBo(m_c * m_r);
				auto Add = [&](int r,int c, int r1, int c1) {
					if ((r1 < 0) || (r1 >= m_r)) { return; }
					if ((c1 < 0) || (c1 >= m_c)) { return; }
				//	if (0 == grid[r][c]) { return; }
					if (0 == grid[r1][c1]) { return; }
					neiBo[Mask(r, c)].emplace_back(std::make_pair(r1, c1));
				};
				for (int r = 0; r < m_r; r++) {
					for (int c = 0; c  < m_c; c++) {
						Add(r, c, r + 1, c);
						Add(r, c, r - 1, c);
						Add(r, c, r , c + 1);
						Add(r, c, r, c -1);
					}
				}
				queue<pair<int, int>> que;
				int cnt1 = 0;
				vector<bool> vis(m_r * m_c);
				for (int r = 0; r < m_r; r++) {
					for (int c = 0; c < m_c; c++) {
						if (0 == grid[r][c]) { continue; }
						cnt1++;
						if ((0 == r) || (0 == c) || (r + 1 == m_r) || (c + 1 == m_c)) {
							que.emplace(make_pair(r, c));
							vis[Mask(r, c)] = true;
						}
					}
				}
				
				while (que.size()) {
					const auto [r, c] = que.front();
					que.pop();
					const int iMask = Mask(r, c);
					for (const auto& [r1,c1] : neiBo[iMask]) {
						if (vis[Mask(r1,c1)]) { continue; }
						vis[Mask(r1, c1)] = true;
						que.emplace(r1, c1);
					}
				}
				return cnt1 - count(vis.begin(), vis.end(), true);
			}
			int Mask(int r, int c) { return  m_c * r + c; }
			 int m_r,m_c;
		};

单元测试

	vector<vector<int>> grid;
		TEST_METHOD(TestMethod1)
		{
			grid = { {0,0,0,0},{1,0,1,0},{0,1,1,0},{0,0,0,0} };
			auto res = Solution().numEnclaves(grid);
			AssertEx(3, res);
		}
		TEST_METHOD(TestMethod2)
		{
			grid = { {0,1,1,0},{0,0,1,0},{0,0,1,0},{0,0,0,0} };
			auto res = Solution().numEnclaves(grid);
			AssertEx(0, res);
		}
		TEST_METHOD(TestMethod3)
		{
			grid = { {0,1,0},{0,1,0},{0,0,0} };
			auto res = Solution().numEnclaves(grid);
			AssertEx(0, res);
		}
		TEST_METHOD(TestMethod4)
		{
			grid = { {0,0,0},{0,1,0},{0,1,0} };
			auto res = Solution().numEnclaves(grid);
			AssertEx(0, res);
		}
		TEST_METHOD(TestMethod5)
		{
			grid = { {0,0,0},{1,1,0},{0,0,0} };
			auto res = Solution().numEnclaves(grid);
			AssertEx(0, res);
		}
		TEST_METHOD(TestMethod6)
		{
			grid = { {0,0,0},{0,1,1},{0,0,0} };
			auto res = Solution().numEnclaves(grid);
			AssertEx(0, res);
		}
		TEST_METHOD(TestMethod7)
		{
			grid = { {0,0,0,0,0},{1,0,1,0,0},{0,0,0,0,0} };
			auto res = Solution().numEnclaves(grid);
			AssertEx(1, 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/1960057.html

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

相关文章

html+css 炫酷的流边按钮

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽效果&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 文…

详细教程:在Octo Browser指纹浏览器中配置IPXProxy代理IP的步骤

​Octo Browser是一款反检测指纹浏览器&#xff0c;可防止在线跟踪并保护用户隐私的网络浏览器。用户可以在Octo Browser中设置代理IP&#xff0c;来进行多账户的管理&#xff0c;降低账户关联的风险。下面以IPXProxy代理IP为例&#xff0c;告诉大家如何在Octo Browser指纹浏览…

顺序栈*链栈

逻辑结构,存储结构,运算 栈的定义 栈是只能在一端进行插入,删除操作的线性表; 栈的操作特征为先进后出,栈的逻辑结果为线性结构,是一种特殊的线性表. 栈顶:允许插入,删除 栈底:不允许插入删除 存储结构--顺序存储 (1)定义 #include<stdio.h> #define MaxSize 10 /…

哪些洗地机比较好?揭晓中国十大名牌洗地机

在当今追求高效与品质生活的时代&#xff0c;洗地机作为现代家居清洁的得力助手&#xff0c;其重要性日益凸显。为了帮助大家在众多品牌中筛选出优质之选&#xff0c;我们精心揭晓中国洗地机领域的十大名牌。这些品牌凭借卓越的性能、创新的技术以及良好的用户口碑&#xff0c;…

开启mybatis-plus日志功能

第一部分&#xff1a;配置文件增添参数 增加如下&#xff1a; configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl 第二部分&#xff1a;运行效果展示

大数据信用报告一般都是在哪里查询?

相信现在有不少人都听说过大数据信用&#xff0c;其实早在几年前&#xff0c;大数据就已经作为银行和借贷机构审核申贷人的重要途径&#xff0c;因为传统的征信报告有一定的局限性&#xff0c;无法全方位的了解申贷人的隐形负债&#xff0c;大数据信用报告的作用就显现出来了&a…

Ansys Zemax|如何模拟复杂的菲涅尔透镜

附件下载 联系工作人员获取附件 概述 这篇文章介绍了如何模拟每个菲涅尔环都由不同数据定义的复杂菲涅尔透镜。这种方法也可以用于定义复杂物体。 介绍 菲涅尔透镜与普通透镜有所区别&#xff0c;它是将普通透镜连续、光滑的表面分成一系列同心圆环&#xff0c;这些同心圆环…

手机高清录屏,快速学会的2种绝妙方法!

在移动互联时代&#xff0c;手机不仅仅是通讯工具&#xff0c;更是我们记录生活、分享经验、创作内容的得力助手。而手机高清录屏功能&#xff0c;则为我们捕捉手机屏幕上的每一帧精彩提供了便捷的方式。无论是游戏直播、教学演示&#xff0c;还是视频制作&#xff0c;手机高清…

创建自己的 Omnigraph (python篇)

Omnigraph 是 Nvidia Omniverse 中一个强大的视觉化脚本工具&#xff0c;它让开发者能够以直观和灵活的方式创建复杂的行为和交互性。通过结合 Action Graphs 和 Push Graphs&#xff0c;以及利用丰富的节点库&#xff0c;用户可以在 Omniverse 平台上构建出令人惊叹的虚拟世界…

Ubuntu虚拟机扩容笔记(各种方法都不行版)

1.背景介绍 最近需要对ubuntu的虚拟机下面的挂载根目录上的文件系统对应的硬盘进行扩容&#xff0c;在虚拟机管理平台对磁盘进行扩容后&#xff0c;在图形界面上尝试扩容&#xff1a; 尝试教程主要采用下面教程的第三种方法&#xff1a; Ubuntu22.04 Linux磁盘扩容/硬盘扩展…

【C++】学习笔记——C++11_1

文章目录 十九、C111. 统一的列表初始化{}初始化std::initializer_list 2. 声明autodecltypenullptr 4. 范围for5. STL中的一些变化新容器新方法 6. 右值引用和移动语句左值引用和右值引用 未完待续 十九、C11 1. 统一的列表初始化 {}初始化 在C98中&#xff0c;标准允许使用…

C++ map/set 函数用法解析

一 . set 1.1 set 是什么、关联/非关联式容器 se是一种关联式容器&#xff0c;主要用进行查找的工作。采用了key模型&#xff0c;判断数据在不在。不支持修改的操作。 序列式容器&#xff08;线性表&#xff09;&#xff1a;vector / list /deque&#xff08;单纯存储数据&am…

top命令从入门到精通

top命令从入门到精通 linux平台上一个可以用于性能监控、排查的神器。 响应参数 up&#xff1a;运行时长users&#xff1a;当前登陆了几个用户load average&#xff1a;运行负载 sleeping&#xff1a;休眠进程stopped&#xff1a;终止进程zombie&#xff1a;僵尸进程 us&…

Neutralinojs教程项目实战初体验(踩坑指南),干翻 electron

Neutralinojs 项目实战初体验&#xff08;踩坑指南&#xff09;&#xff0c;干翻 electron Neutralinojs 官方文档 卧槽卧槽&#xff0c;&#xff01;这个年轻人居然用浏览器把电脑关机了_哔哩哔哩_bilibili正是在下 本教程搭建的是纯原生项目&#xff0c;没有和其它前端框架…

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

本文涉及知识点 CBFS算法 LeetCode959. 由斜杠划分区域 在由 1 x 1 方格组成的 n x n 网格 grid 中&#xff0c;每个 1 x 1 方块由 ‘/’、‘’ 或空格构成。这些字符会将方块划分为一些共边的区域。 给定网格 grid 表示为一个字符串数组&#xff0c;返回 区域的数量 。 请注…

整理压缩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;数据收集、存储和分发方面的进步产生…