当前位置: 首页 > 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;
}

http://www.lryc.cn/news/435941.html

相关文章:

  • 什么是API网关(API Gateway)?
  • 对话:LLC磁集成能否成为充电桩模块电源常态产品?
  • 基于SSM的二手物品交易管理系统的设计与实现 (含源码+sql+视频导入教程+文档+PPT)
  • 视觉语言模型中的人脸社会感知
  • JAVA学习-练习试用Java实现“最小覆盖子串”
  • 关于axios同步获取数据的问题
  • java-在ANTLR中,如何从java文件中提取类名和方法名0.1.8
  • 十大护眼灯钢琴灯品牌是智商税吗?十大钢琴灯品牌排行榜
  • 搜维尔科技:CyberGlove将实时捕捉运动信号和触觉反馈,将其重新定位到人形机器人进行驱动
  • 数据结构:堆的算法
  • python画图|3D直方图基础教程
  • C语言中的函数,实参,形参,递归
  • ICM20948 DMP代码详解(15)
  • NC 和为K的连续子数组
  • JS设计模式之装饰者模式:优雅的给对象增添“魔法”
  • 准备好了吗?JAVA从业AI开发的学习路线详解
  • 神经网络通俗理解学习笔记(1)
  • 有n个人,他们需要分配m元钱(m>n),每个人至少分到1元钱,且每个人分到的钱数必须是整数。请问有多少种分配方案?
  • 光耦——创新引擎 助推中国经济高质量发展
  • Go 中 RPC 的使用教程
  • 挖耳勺可以伸进耳朵多深?安全可视挖耳勺推荐!
  • SuperMap GIS基础产品FAQ集锦(20240911)
  • 从状态管理到性能优化:全面解析 Android Compose
  • ChatGPT提示词优化大师使用指南
  • 计算机毕业设计 智能推荐旅游平台 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
  • 【拥抱AI】基于多种数据分段工具的优缺点分析
  • 在 Windows 系统上,文件传输到虚拟机(VM)可以通过 VS Code 的图形界面(GUI)或命令行工具进行操作
  • kafka的主要功能
  • vue3中provide和inject详解
  • 相约华中科技大学,移动云技术论坛来了!NineData创始人CEO叶正盛将分享《数据库全球实时传输技术实践》的主题演讲