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

本文涉及知识点

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.rhkb.cn/news/386798.html

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

相关文章

【C++初阶】string类

【C初阶】string类 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;C&#x1f96d; &#x1f33c;文章目录&#x1f33c; 1. 为什么学习string类&#xff1f; 1.1 C语言中的字符串 1.2 实际中 2. 标准库中的string类 2.1 string类 2.…

前缀表达式(波兰式)和后缀表达式(逆波兰式)的计算方式

缀是指操作符。 1. 前缀表达式&#xff08;波兰式&#xff09; &#xff08;1&#xff09;不需用括号&#xff1b; &#xff08;2&#xff09;不用考虑运算符的优先级&#xff1b; &#xff08;3&#xff09;操作符置于操作数的前面。&#xff08;如 3 2 &#xff09; 1.1 中…

《Programming from the Ground Up》阅读笔记:p75-p87

《Programming from the Ground Up》学习第4天&#xff0c;p75-p87总结&#xff0c;总计13页。 一、技术总结 1.persistent data p75, Data which is stored in files is called persistent data, because it persists in files that remain on disk even when the program …

hash表如何形成,hash函数如何计算,什么是hash冲突 如何解决 ,Golang map的底层原理及扩容机制

散列表 散列表&#xff08;hash表&#xff09;:根据给定的关键字来计算出关键字在表中的地址的数据结构。也就是说&#xff0c;散列表建立了关键字和 存储地址之间的一种直接映射关系。 问题&#xff1a;如何建立映射管血 散列函数:一个把查找表中的关键字映射成该关键字对应…

oracle语法介绍

Oracle数据库是关系型数据库管理系统之一&#xff0c;其SQL语法遵循标准的SQL规范&#xff0c;但也有一些自己的扩展。以下是一些Oracle SQL语法的基本示例&#xff1a; 1.选择数据&#xff1a; SELECT * FROM my_table; 1.插入数据&#xff1a; INSERT INTO my_table (colum…

RocketMQ事务消息机制原理

RocketMQ工作流程 在RocketMQ当中&#xff0c;当消息的生产者将消息生产完成之后&#xff0c;并不会直接将生产好的消息直接投递给消费者&#xff0c;而是先将消息投递个中间的服务&#xff0c;通过这个服务来协调RocketMQ中生产者与消费者之间的消费速度。 那么生产者是如何…

【设计模式】工厂模式详解

1.简介 工厂模式是一种创建型设计模式&#xff0c;通过提供一个接口或抽象类来创建对象&#xff0c;而不是直接实例化对象。工厂模式的主要思想是将对象的创建与使用分离&#xff0c;使得创建对象的过程更加灵活和可扩展。 工厂模式主要包括以下角色&#xff1a; 抽象工厂&a…

地铁深基坑结构施工预警实时监测系统测点布设

01 基坑监测背景 随着我国城市建设的发展&#xff0c;基坑规模和开挖深度不断增加。在基坑开挖过程中&#xff0c;如何尽快的在第一时间了解基坑的变形情况&#xff0c;并动态评估基坑的结构安全&#xff0c;避免事故的发生。与其它监测方法相比&#xff0c;实现自动化监测、信…

gradio 之页面布局

输出组件的可交互&#xff0c;默认垂直排列 import gradio as gr def greet(name):return "Hello " name "!" with gr.Blocks() as demo:name gr.Textbox(label"Name")# 不可交互# output gr.Textbox(label"Output Box")# 可交互…

超声波清洗机哪个品牌比较好耐用?好用的超声波清洗机推荐

随着科技的发展&#xff0c;超声波清洗机已经慢慢出现在我们日常生活中了。像日常使用的小物品&#xff0c;如手表和首饰等&#xff0c;时间久了&#xff0c;难免会积累灰尘&#xff0c;滋生细菌。那么应该如何进行彻底清洁呢&#xff1f;超声波清洗机可以给我们答案&#xff0…

Move生态:从Aptos和Sui到Starcoin的崛起

区块链技术自诞生以来&#xff0c;已经经历了多个发展阶段和技术迭代。近年来&#xff0c;随着智能合约平台的不断演进&#xff0c;以Move语言为核心的生态系统逐渐崭露头角。Move语言以其安全性、灵活性和高效性吸引了大量开发者和项目方的关注。在Move生态中&#xff0c;Apto…

uniapp实现局域网(内网)中APP自动检测版本,弹窗提醒升级

uniapp实现局域网&#xff08;内网&#xff09;中APP自动检测版本&#xff0c;弹窗提醒升级 在开发MES系统的过程中&#xff0c;涉及到了平板端APP的开发&#xff0c;既然是移动端的应用&#xff0c;那么肯定需要APP版本的自动更新功能。 查阅相关资料后&#xff0c;在uniapp的…

【数据结构】——双链表的实现(赋源码)

双链表的概念和结构 双链表的全称叫做&#xff1a;带头双向循环链表 它的结构示意图如下 注意&#xff1a;这⾥的“带头”跟前⾯我们说的单链表的“头结点”是两个概念&#xff0c;实际前⾯的在单链表阶段称呼不严谨&#xff0c;但是为了读者们更好的理解就直接称为单链表的头…

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

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

遥感领域新方向!Mamba+RS论文汇总!

本文总结了将Mamba应用至遥感领域的相关论文&#xff08;14篇&#xff09;&#xff0c;涉及到的论文见文末链接&#xff0c;具体如下&#xff1a; 文章目录 1. 遥感图像处理2. 多/高光谱图像分类3. 变化检测/语义分割4. 遥感图像融合/超分辨率 1. 遥感图像处理 论文题目&#…

6.3 面向对象技术-设计模式

设计模式 创建型模式 结构型模式 行为型模式 真题

配置本地开发服务器代理请求以及登录模块开发(二)

项目初始化完成之后&#xff0c;准备开始进行项目的开发&#xff0c;首先配置好开发环境作为整个项目的基础 一、配置代理 1、config/proxy.ts配置代理 export default {// 如果需要自定义本地开发服务器 请取消注释按需调整dev: {// localhost:8000/api/** -> https://p…

第07课 Scratch入门篇:水果音乐钢琴

水果音乐钢琴 入门篇适合新手&#xff0c;如您已经学过&#xff0c;可以忽略本节课&#xff01; 一、故事背景&#xff1a; 在一个充满创意和想象的奇妙世界里&#xff0c;有一架与众不同的钢琴——水果音乐钢琴。这架钢琴的键盘不是由普通的黑白键组成&#xff0c;而是由各种…

http post请求 - 最简测试环境 - 使用flask

1.缘起 工作中&#xff0c;我们有时需要测试web post功能是否正常。这类测试&#xff0c;客户端的请求很容易实现&#xff0c;比如portman&#xff0c;比如非常简单的命令行curl语法&#xff1a; curl -X POST http://127.0.0.1:5000/post-endpoint/ -F "warning_image/p…

鸿蒙 HarmonyOS NEXT端云一体化开发-云数据库篇

一、概述 云数据库是一款基于对象模型的数据库&#xff0c;采用存储区、对象类型和对象三级结构。 数据模型 存储区 存储区是一个独立的数据存储区域&#xff0c;多个数据存储区之间相互独立&#xff0c;每个存储区拥有完全相同的对象类型定义 --类似于关系型数据库中的da…