当前位置: 首页 > news >正文

图论篇--代码随想录算法训练营第五十一天打卡| 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. 岛屿数量&#xff08;深搜版&#xff09; 题目链接&#xff1a;99. 岛屿数量 题目描述&#xff1a; 给定一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的矩阵&#xff0c;你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而…...

什么是API网关(API Gateway)?

1. 什么是API网关&#xff08;API Gateway&#xff09;&#xff1f; 在微服务体系结构中&#xff0c;客户端可能与多个前端服务进行交互。 API 网关位于客户端与服务之间。 它充当反向代理&#xff0c;将来自客户端的请求路由到服务。 它还可以执行各种横切任务&#xff0c;例…...

对话:LLC磁集成能否成为充电桩模块电源常态产品?

编者按&#xff1a;在终端需求疲软的影响下&#xff0c;前两年火热的新能源汽车、光伏、储能等新能源领域也掀起了价格战&#xff0c;储能已正式进入0.5元时代&#xff0c;新能源汽车领域价格战更是一轮接一轮&#xff0c;成本管控成为2024年企业绕不开的话题。 接下来我们将围…...

基于SSM的二手物品交易管理系统的设计与实现 (含源码+sql+视频导入教程+文档+PPT)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的二手物品交易管理系统7拥有两种角色 管理员&#xff1a;用户管理、分类管理、商品管理、订单管理、系统管理等 用户&#xff1a;登录注册、充值、收货、评价、收藏、购物车、订…...

视觉语言模型中的人脸社会感知

本文研究了视觉语言模型CLIP在处理人脸图像时的社会感知能力及其潜在偏见。研究者们构建了一个名为CausalFace的合成人脸数据集&#xff0c;通过系统地独立变化年龄、性别、人种、面部表情、照明和姿势等六个维度来评估模型的社会感知。他们发现&#xff0c;尽管CLIP是在多样化…...

JAVA学习-练习试用Java实现“最小覆盖子串”

问题&#xff1a; 给定一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 "" 。 注意&#xff1a;如果 s 中存在这样的子串&#xff0c;我们保证它是唯一的答案。 示例 1&…...

关于axios同步获取数据的问题

axios同步获取数据 Axios介绍问题代码修改 总结 Axios介绍 Axios 是一个基于 promise 网络请求库&#xff0c;作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 X…...

java-在ANTLR中,如何从java文件中提取类名和方法名0.1.8

java-在ANTLR中&#xff0c;如何从java文件中提取类名和方法名0.1.0 目标java源文件java的g4文件生成antlr代码最终代码调测结果阶段性总结 2024年9月12日11:16:01----0.1.8 目标 从一个java文件中提取出类名和方法名 java源文件 文件名是main.java&#xff0c;具体内容如下…...

十大护眼灯钢琴灯品牌是智商税吗?十大钢琴灯品牌排行榜

十大护眼灯钢琴灯品牌是智商税吗&#xff1f;不良的光线不仅会使得孩子在读写用眼时眼睛不舒服&#xff0c;还会引起视觉疲劳伤眼视力健康&#xff0c;这个时候要能有一台可靠的护眼灯钢琴灯&#xff0c;那真是再好不过了。但是市面上护眼灯钢琴灯的种类太多&#xff0c;盲目挑…...

搜维尔科技:CyberGlove将实时捕捉运动信号和触觉反馈,将其重新定位到人形机器人进行驱动

CyberGlove将实时捕捉运动信号和触觉反馈&#xff0c;然后将其重新定位到人形机器人上。 这款18个传感器&#xff08;有18节点和22节点两个型号&#xff0c;22节点早期用于美国军事方面&#xff0c;支持无线通信、蓝牙、WiFi、射频&#xff09;数据手套的每个手指上有两个弯曲…...

数据结构:堆的算法

目录 一堆的向上调整算法二堆的向下调整算法三堆的应用:堆排序四TOPK问题 一堆的向上调整算法 我们在堆中插入一个数据一般实在堆的最后插入然后可以一步一步与上层结点&#xff08;父结点进行比较&#xff09;&#xff0c;继而进行交换&#xff0c;完成二叉树的结构&#xff0…...

python画图|3D直方图基础教程

前述已经完成了直方图和3D图的基本学习&#xff0c;链接如下&#xff1a; 直方图&#xff1a;python画图|水平直方图绘制-CSDN博客 3D图&#xff1a;python画图|水平直方图绘制-CSDN博客 现在我们尝试把二者结合&#xff0c;画3D直方图。 【1】官网教程 首先&#xff0c;依…...

C语言中的函数,实参,形参,递归

1&#xff1a;什么是函数 2&#xff1a;定义带形式参数的函数和带实际参数的函数 3&#xff1a;递归 --------------------------------------------------------------------------------------------------------------------------------- 1&#xff1a;在 C 语言中&…...

ICM20948 DMP代码详解(15)

接前一篇文章&#xff1a;ICM20948 DMP代码详解&#xff08;14&#xff09; 上一回开始对icm20948_sensor_setup函数中第3段代码即inv_icm20948_initialize函数进行解析。为了便于理解和回顾&#xff0c;再次贴出其源码&#xff0c;在EMD-Core\sources\Invn\Devices\Drivers\IC…...

NC 和为K的连续子数组

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 给定一个无序…...

JS设计模式之装饰者模式:优雅的给对象增添“魔法”

引言 在前端开发中&#xff0c;我们经常会遇到需要在不修改已有代码的基础上给对象添加新的行为或功能的情况。而传统的继承方式并不适合这种需求&#xff0c;因为继承会导致类的数量急剧增加&#xff0c;且每一个子类都会固定地实现一种特定的功能扩展。 装饰者模式则提供了…...

准备好了吗?JAVA从业AI开发的学习路线详解

作为一个拥有扎实 Java 基础的人&#xff0c;想要涉足人工智能&#xff08;AI&#xff09;应用开发&#xff0c;你已经在编程能力方面打下了很好的基础。Java 是一种通用的、强类型的语言&#xff0c;非常适合于开发高性能的应用程序&#xff0c;尤其是在后端服务和大规模分布式…...

神经网络通俗理解学习笔记(1)

神经网络通俗理解学习笔记&#xff08;1&#xff09; 神经网络原理激活函数前向传播和反向传播多层感知机代码实现加载数据网络结构损失函数优化器训练测试保存 回归问题一元线性回归多元线性回归多项式回归 线性回归代码实现数据生成设置超参数初始化参数可视化Pytorch模型实现…...

有n个人,他们需要分配m元钱(m>n),每个人至少分到1元钱,且每个人分到的钱数必须是整数。请问有多少种分配方案?

分配方案 描述 有n个人&#xff0c;他们需要分配m元钱(m>n)&#xff0c;每个人至少分到1元钱&#xff0c;且每个人分到的钱数必须是整数。请问有多少种分配方案? 输入 一行&#xff0c;两个整数&#xff0c;分别是人数n与钱数m&#xff0c;用一个空格隔开。 输出 一行&am…...

光耦——创新引擎 助推中国经济高质量发展

近年来&#xff0c;中国经济正处于转型升级的关键时期&#xff0c;高质量发展成为经济发展的重要目标。在这一伟大征程中&#xff0c;光耦作为一种关键性的电子元器件&#xff0c;正在发挥着重要的作用&#xff0c;助力中国经济迈向更加光明的未来。 光耦概念及工作原理 ▲光耦…...

Go 中 RPC 的使用教程

前言 RPC&#xff08;Remote Procedure Call&#xff09;是一种允许程序调用远程服务器上函数的方法&#xff0c;调用过程对于开发者来说像是调用本地函数一样方便。Go 语言自带了强大的 net/rpc 库&#xff0c;能够让开发者轻松实现基于 Go 的 RPC 服务。本文将介绍 Go 中 RP…...

挖耳勺可以伸进耳朵多深?安全可视挖耳勺推荐!

一般来说&#xff0c;挖耳勺不应该伸进耳朵太深&#xff0c;外耳道的长度大约在2.5厘米到3.5厘米之间&#xff0c;但不建议将挖耳勺伸进超过外耳道外1/3的深度&#xff0c;也就是大概1厘米左右较为安全。因为如果伸得太深&#xff0c;很容易损伤外耳道皮肤&#xff0c;引起疼痛…...

SuperMap GIS基础产品FAQ集锦(20240911)

一、SuperMap iObjects Java 问题1&#xff1a;【iObject Python】Objects Python产品有哪些能力特性和优势&#xff1f; 11.2.0 【解决办法】iObjects Python产品包含传统GIS功能&#xff08;基于iObjects Java扩展的功能接口&#xff09;和AI GIS功能模块。 其中传统GIS功能…...

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compo…...

ChatGPT提示词优化大师使用指南

我希望你成为我的ChatGPT提示词优化大师。 您的目标是帮助我根据自己的需要制定尽可能最好的提示。 你提供的提示应该是站在我向ChatGPT发起请求的角度来写的。我的初始提示词如下&#xff1a;此处填入你的初始提示词 ChatGPT提示词生成器 我希望你充当提示词生成器。 比如&…...

计算机毕业设计 智能推荐旅游平台 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…...

【拥抱AI】基于多种数据分段工具的优缺点分析

最近在深入了解RAG方面的知识&#xff0c;其中数据清洗和数据分段是创建知识库的重要步骤。数据清洗目前暂时选用了MinerU&#xff0c;然后就需要针对数据分段进行选型。 以下是我了解到的几种数据分段工具&#xff0c;简单总结了一下它们的优缺点&#xff0c;权当笔记分享&am…...

在 Windows 系统上,文件传输到虚拟机(VM)可以通过 VS Code 的图形界面(GUI)或命令行工具进行操作

在 Windows 系统上&#xff0c;文件传输到虚拟机&#xff08;VM&#xff09;可以通过 VS Code 的图形界面&#xff08;GUI&#xff09;或命令行工具进行操作。以下是几种方法&#xff1a; ### 方法 1: 使用 VS Code 图形界面 1. **连接到远程 VM**&#xff1a; - 在 VS Cod…...

kafka的主要功能

Apache Kafka 是一个分布式流处理平台&#xff0c;它最初由 LinkedIn 开发&#xff0c;后来捐赠给了 Apache Software Foundation&#xff0c;并成为了 Apache 的顶级项目。Kafka 设计用于处理实时数据流&#xff0c;并且提供了高性能、可扩展性和持久性。下面是 Kafka 的主要功…...

vue3中provide和inject详解

provide和inject是什么 provide 和 inject 是 Vue.js 框架中提供的一种依赖注入机制。这种机制允许一个祖先组件&#xff08;提供者&#xff09;向其所有子孙组件&#xff08;使用者&#xff09;提供数据或方法&#xff0c;而不需要通过逐层组件传递属性&#xff08;props&…...