图论篇--代码随想录算法训练营第五十一天打卡| 99. 岛屿数量(深搜版),99. 岛屿数量(广搜版),100. 岛屿的最大面积
99. 岛屿数量(深搜版)
题目链接:99. 岛屿数量
题目描述:
给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。
解题思路:
1、每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
2、遇到一个没有遍历过的节点陆地,计数器就加一,然后把该节点陆地所能遍历到的陆地都标记上。在遇到标记过的陆地节点和海洋节点的时候直接跳过。 这样计数器就是最终岛屿的数量。
代码:
#include<iostream>
#include<vector>
using namespace std;int dx[4] = {-1,0,0,1};
int dy[4] = {0,-1,1,0};
void dfs(vector<vector<int>>& matrix, vector<vector<bool>>& island, int r, int c)
{for(int i = 0; i < 4; i++){int x = r + dx[i];int y = c + dy[i];if(x < 0 || y < 0 || x >= matrix.size() || y >= matrix[0].size() || matrix[x][y] == 0 || island[x][y]) continue;island[x][y] = true;dfs(matrix,island,x,y);}
}int main()
{int n , m;cin >> n >> m;vector<vector<int>> matrix(n+2,vector<int>(m+2));vector<vector<bool>> island(n+2,vector<bool>(m+2));for(int i = 1; i <= n; i++)for(int j = 1; j <= m; j++)cin >> matrix[i][j];int result = 0;for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){if(matrix[i][j] == 1 && !island[i][j]){result++;island[i][j] = true;dfs(matrix,island, i,j);}}}cout << result << endl;return 0;
}
99. 岛屿数量(广搜版)
解题思路:
1、每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
2、遇到一个没有遍历过的节点陆地,计数器就加一,然后把该节点陆地所能遍历到的陆地都标记上。在遇到标记过的陆地节点和海洋节点的时候直接跳过。 这样计数器就是最终岛屿的数量。
3、加入队列就代表走过,就需要标记
代码:
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
typedef pair<int,int> PII;int dx[4] = {-1,0,0,1};
int dy[4] = {0,-1,1,0};
void bfs(vector<vector<int>>& matrix, vector<vector<bool>>& island, int r, int c)
{queue<PII> q;q.push({r,c});while(!q.empty()){PII val = q.front();q.pop();for(int i = 0; i < 4; i ++){int x = val.first + dx[i], y = val.second + dy[i];if(x < 0 || x >= matrix.size() || y < 0 || y >= matrix[0].size()) continue;if(matrix[x][y] == 1 && !island[x][y]) {island[x][y] = true;q.push({x,y});}}}
}int main()
{int n , m;cin >> n >> m;vector<vector<int>> matrix(n+2,vector<int>(m+2));vector<vector<bool>> island(n+2,vector<bool>(m+2));for(int i = 1; i <= n; i++)for(int j = 1; j <= m; j++)cin >> matrix[i][j];int result = 0;for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){if(matrix[i][j] == 1 && !island[i][j]){result++;island[i][j] = true;bfs(matrix,island, i,j);}}}cout << result << endl;return 0;
}
100. 岛屿的最大面积
题目链接:100. 岛屿的最大面积
题目描述:
给定一个由 1(陆地)和 0(水)组成的矩阵,计算岛屿的最大面积。岛屿面积的计算方式为组成岛屿的陆地的总数。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。
解题思路:
上一题的变形,此时计数器统计的是每一个岛屿中1的个数,因此需要放置在dfs中计数
代码:
1)dfs有返回
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;int dx[4] = {-1, 0, 0, 1};
int dy[4] = {0, -1, 1, 0};int dfs(vector<vector<int>>& matrix, vector<vector<int>>& visited, int r, int c)
{visited[r][c] = true; // 标记当前点为已访问int area = 1; // 当前格子也算一个面积单位for(int i = 0; i < 4; i++){int x = dx[i] + r, y = dy[i] + c;// 边界检查,防止越界if(x < 1 || y < 1 || x >= matrix.size()-1 || y >= matrix[0].size()-1) continue;if(!visited[x][y] && matrix[x][y] == 1){area += dfs(matrix, visited, x, y); // 递归累加面积}}return area;
}int main()
{int n, m;cin >> n >> m;vector<vector<int>> matrix(n+2, vector<int>(m+2));vector<vector<int>> visited(n+2, vector<int>(m+2, 0)); // 初始化为未访问for(int i = 1; i <= n; i++)for(int j = 1; j <= m; j++)cin >> matrix[i][j];int max_area = 0;for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){if(matrix[i][j] == 1 && !visited[i][j]){int area = dfs(matrix, visited, i, j); // 计算当前连通区域的面积max_area = max(max_area, area); // 更新最大面积}}}cout << max_area << endl;return 0;
}
2)dfs无返回
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;int dx[4] = {-1,0, 0, 1};
int dy[4] = {0,-1,1,0};int cnt;void dfs(vector<vector<int>>& matrix,vector<vector<int>>& visited, int r , int c)
{cnt ++;visited[r][c] = true;for(int i = 0; i < 4; i++){int x = dx[i] + r, y = dy[i] + c;if(x < 0 || y < 0 || x >= matrix.size() || y >= matrix[0].size()) continue;if(!visited[x][y] && matrix[x][y] == 1){dfs(matrix,visited,x,y);}}
}int main()
{int n, m;cin >> n >> m;vector<vector<int>> matrix(n+2,vector<int>(m+2));vector<vector<int>> visited(n+2,vector<int>(m+2));for(int i = 1; i <= n; i++)for(int j = 1; j <= m; j++)cin >> matrix[i][j];int area = 0;for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){if(matrix[i][j] == 1 && !visited[i][j]){cnt = 0;dfs(matrix,visited,i,j);area = max(area,cnt);}}}cout << area << endl;return 0;
}
相关文章:
图论篇--代码随想录算法训练营第五十一天打卡| 99. 岛屿数量(深搜版),99. 岛屿数量(广搜版),100. 岛屿的最大面积
99. 岛屿数量(深搜版) 题目链接:99. 岛屿数量 题目描述: 给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而…...
什么是API网关(API Gateway)?
1. 什么是API网关(API Gateway)? 在微服务体系结构中,客户端可能与多个前端服务进行交互。 API 网关位于客户端与服务之间。 它充当反向代理,将来自客户端的请求路由到服务。 它还可以执行各种横切任务,例…...
对话:LLC磁集成能否成为充电桩模块电源常态产品?
编者按:在终端需求疲软的影响下,前两年火热的新能源汽车、光伏、储能等新能源领域也掀起了价格战,储能已正式进入0.5元时代,新能源汽车领域价格战更是一轮接一轮,成本管控成为2024年企业绕不开的话题。 接下来我们将围…...
基于SSM的二手物品交易管理系统的设计与实现 (含源码+sql+视频导入教程+文档+PPT)
👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的二手物品交易管理系统7拥有两种角色 管理员:用户管理、分类管理、商品管理、订单管理、系统管理等 用户:登录注册、充值、收货、评价、收藏、购物车、订…...
视觉语言模型中的人脸社会感知
本文研究了视觉语言模型CLIP在处理人脸图像时的社会感知能力及其潜在偏见。研究者们构建了一个名为CausalFace的合成人脸数据集,通过系统地独立变化年龄、性别、人种、面部表情、照明和姿势等六个维度来评估模型的社会感知。他们发现,尽管CLIP是在多样化…...
JAVA学习-练习试用Java实现“最小覆盖子串”
问题: 给定一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。 注意:如果 s 中存在这样的子串,我们保证它是唯一的答案。 示例 1&…...
关于axios同步获取数据的问题
axios同步获取数据 Axios介绍问题代码修改 总结 Axios介绍 Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 X…...
java-在ANTLR中,如何从java文件中提取类名和方法名0.1.8
java-在ANTLR中,如何从java文件中提取类名和方法名0.1.0 目标java源文件java的g4文件生成antlr代码最终代码调测结果阶段性总结 2024年9月12日11:16:01----0.1.8 目标 从一个java文件中提取出类名和方法名 java源文件 文件名是main.java,具体内容如下…...
十大护眼灯钢琴灯品牌是智商税吗?十大钢琴灯品牌排行榜
十大护眼灯钢琴灯品牌是智商税吗?不良的光线不仅会使得孩子在读写用眼时眼睛不舒服,还会引起视觉疲劳伤眼视力健康,这个时候要能有一台可靠的护眼灯钢琴灯,那真是再好不过了。但是市面上护眼灯钢琴灯的种类太多,盲目挑…...
搜维尔科技:CyberGlove将实时捕捉运动信号和触觉反馈,将其重新定位到人形机器人进行驱动
CyberGlove将实时捕捉运动信号和触觉反馈,然后将其重新定位到人形机器人上。 这款18个传感器(有18节点和22节点两个型号,22节点早期用于美国军事方面,支持无线通信、蓝牙、WiFi、射频)数据手套的每个手指上有两个弯曲…...
数据结构:堆的算法
目录 一堆的向上调整算法二堆的向下调整算法三堆的应用:堆排序四TOPK问题 一堆的向上调整算法 我们在堆中插入一个数据一般实在堆的最后插入然后可以一步一步与上层结点(父结点进行比较),继而进行交换,完成二叉树的结构࿰…...
python画图|3D直方图基础教程
前述已经完成了直方图和3D图的基本学习,链接如下: 直方图:python画图|水平直方图绘制-CSDN博客 3D图:python画图|水平直方图绘制-CSDN博客 现在我们尝试把二者结合,画3D直方图。 【1】官网教程 首先,依…...
C语言中的函数,实参,形参,递归
1:什么是函数 2:定义带形式参数的函数和带实际参数的函数 3:递归 --------------------------------------------------------------------------------------------------------------------------------- 1:在 C 语言中&…...
ICM20948 DMP代码详解(15)
接前一篇文章:ICM20948 DMP代码详解(14) 上一回开始对icm20948_sensor_setup函数中第3段代码即inv_icm20948_initialize函数进行解析。为了便于理解和回顾,再次贴出其源码,在EMD-Core\sources\Invn\Devices\Drivers\IC…...
NC 和为K的连续子数组
系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 给定一个无序…...
JS设计模式之装饰者模式:优雅的给对象增添“魔法”
引言 在前端开发中,我们经常会遇到需要在不修改已有代码的基础上给对象添加新的行为或功能的情况。而传统的继承方式并不适合这种需求,因为继承会导致类的数量急剧增加,且每一个子类都会固定地实现一种特定的功能扩展。 装饰者模式则提供了…...
准备好了吗?JAVA从业AI开发的学习路线详解
作为一个拥有扎实 Java 基础的人,想要涉足人工智能(AI)应用开发,你已经在编程能力方面打下了很好的基础。Java 是一种通用的、强类型的语言,非常适合于开发高性能的应用程序,尤其是在后端服务和大规模分布式…...
神经网络通俗理解学习笔记(1)
神经网络通俗理解学习笔记(1) 神经网络原理激活函数前向传播和反向传播多层感知机代码实现加载数据网络结构损失函数优化器训练测试保存 回归问题一元线性回归多元线性回归多项式回归 线性回归代码实现数据生成设置超参数初始化参数可视化Pytorch模型实现…...
有n个人,他们需要分配m元钱(m>n),每个人至少分到1元钱,且每个人分到的钱数必须是整数。请问有多少种分配方案?
分配方案 描述 有n个人,他们需要分配m元钱(m>n),每个人至少分到1元钱,且每个人分到的钱数必须是整数。请问有多少种分配方案? 输入 一行,两个整数,分别是人数n与钱数m,用一个空格隔开。 输出 一行&am…...
光耦——创新引擎 助推中国经济高质量发展
近年来,中国经济正处于转型升级的关键时期,高质量发展成为经济发展的重要目标。在这一伟大征程中,光耦作为一种关键性的电子元器件,正在发挥着重要的作用,助力中国经济迈向更加光明的未来。 光耦概念及工作原理 ▲光耦…...
4大价值点:旧设备复活开源工具如何让经典iOS设备重获新生?
4大价值点:旧设备复活开源工具如何让经典iOS设备重获新生? 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to downgrade/restore, save SHSH blobs, and jailbreak legacy iOS devices 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-…...
解决企业知识孤岛挑战:Outline多平台文档迁移架构与技术实现方案
解决企业知识孤岛挑战:Outline多平台文档迁移架构与技术实现方案 【免费下载链接】outline Outline 是一个基于 React 和 Node.js 打造的快速、协作式团队知识库。它可以让团队方便地存储和管理知识信息。你可以直接使用其托管版本,也可以自己运行或参与…...
150元搞定无人机自主避障?上交大开源方案实测(附部署教程)
150元打造无人机自主避障系统:开源方案实战指南 当大多数人还在为动辄上万元的无人机避障系统望而却步时,一个仅需150元计算硬件的开源方案正在创客圈掀起风暴。这不是实验室里的概念验证,而是经过真实环境测试、能部署在你家后院的技术方案。…...
Sora.FM零基础部署指南:3步上手AI视频生成工具的Linux实践方案
Sora.FM零基础部署指南:3步上手AI视频生成工具的Linux实践方案 【免费下载链接】sorafm 项目地址: https://gitcode.com/GitHub_Trending/so/sorafm Sora.FM是一款基于Sora AI技术的开源视频生成平台,支持通过文本描述创建高质量AI视频。本指南专…...
OpenRocket:开源火箭仿真软件的设计与分析全指南
OpenRocket:开源火箭仿真软件的设计与分析全指南 【免费下载链接】openrocket Model-rocketry aerodynamics and trajectory simulation software 项目地址: https://gitcode.com/GitHub_Trending/op/openrocket OpenRocket作为一款专业的开源火箭设计与仿真…...
Remult项目实战:如何从零构建企业级CRM系统的完整流程
Remult项目实战:如何从零构建企业级CRM系统的完整流程 【免费下载链接】remult Full-stack CRUD, simplified, with SSOT TypeScript entities 项目地址: https://gitcode.com/gh_mirrors/re/remult 在当今快速发展的商业环境中,企业级CRM系统已成…...
Laf云平台终极灾备指南:如何实现多区域部署与智能故障转移
Laf云平台终极灾备指南:如何实现多区域部署与智能故障转移 【免费下载链接】laf labring/laf: 是一个用于 PHP 的轻量级 AJAX 库,可以方便地在 PHP 应用中实现 AJAX 通信。适合对 PHP、AJAX 库和想要实现 PHP AJAX 通信的开发者。 项目地址: https://g…...
保姆级教程:在PX4 1.13.1固件下,从零开始编写一个自定义控制模块(附完整代码)
PX4 1.13.1固件下自定义控制模块开发全流程指南 当你第一次打开PX4的源码目录,面对层层嵌套的文件夹和复杂的编译系统,是否感到无从下手?作为一款开源的无人机飞控系统,PX4的强大之处在于其高度模块化的设计,允许开发者…...
Cardano节点高级功能探索:质押池、智能合约与治理的终极指南
Cardano节点高级功能探索:质押池、智能合约与治理的终极指南 【免费下载链接】cardano-node The core component that is used to participate in a Cardano decentralised blockchain. 项目地址: https://gitcode.com/gh_mirrors/ca/cardano-node Cardano节…...
【嵌入式Linux】---- 从零构建:基于PetaLinux与SDK的GPIO驱动开发与系统集成实战
1. 环境准备与工程创建 第一次接触Zynq开发板和嵌入式Linux时,我完全被各种工具链和配置选项搞晕了。后来发现只要按照正确步骤搭建环境,其实并没有想象中那么复杂。这里分享我从零开始构建GPIO驱动开发环境的完整过程。 首先需要准备一台运行Ubuntu 18.…...
