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

代码随想录算法训练营 Day51 图论Ⅱ岛屿问题Ⅰ

图论

题目

99. 岛屿数量
使用 DFS 实现方法
判断岛屿方法
1. 遍历图,若遍历到了陆地 grid[i][j] = 1 并且陆地没有被访问,在这个陆地的基础上进行 DFS 方法,或者是 BFS 方法
2. 对陆地进行 DFS 的时候时刻注意以访问的元素添加访问标记
在这里插入图片描述

// DFS方法1
#include <iostream>
#include <vector>int dir[4][2] = {0,1,1,0,-1,0,0,-1};
void dfs(std::vector<std::vector<int>>& grid, std::vector<std::vector<bool>>& vis, int x, int y) {// 从四个方向进行搜索for (int i = 0; i < 4; ++i) {int nexti = x + dir[i][0];int nextj = y + dir[i][1];// 边界情况判定if (nexti < 0 || nexti >= grid.size()|| nextj < 0 || nextj >= grid[0].size()) continue;// 访问情况判定if (!vis[nexti][nextj] && grid[nexti][nextj] == 1) {// 时刻注意访问标记vis[nexti][nextj] = true;dfs(grid, vis, nexti, nextj);}}
}int main() {// 输入处理int n, m, res = 0;std::cin >> n >> m;std::vector<std::vector<int>> grid(n, std::vector<int>(m, 0));std::vector<std::vector<bool>> vis(n, std::vector<bool>(m, false));for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {std::cin >> grid[i][j];}}// 遍历网格进行DFS操作for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {// 访问到新陆地对该陆地进行遍历if (grid[i][j] == 1 && !vis[i][j]) {res++; // 记录新大陆vis[i][j] = true;dfs(grid, vis, i, j);}}}// 输出处理std::cout << res << std::endl;
}// dfs 三部曲写法
#include <iostream>
#include <vector>
using namespace std;int dir[4][2] = {0,-1,-1,0,1,0,0,1}; // 逆时针顺序
// 第一步参数与返回值
void dfs(vector<vector<int>>& grid, vector<vector<bool>>& vis, int x, int y) {// 第二部 终止条件if (vis[x][y] || grid[x][y] == 0) return;// 第三部 单层递归逻辑vis[x][y] = true;for (int i = 0; i < 4; ++i) {int nextX = x + dir[i][0];int nextY = y + dir[i][1];if (nextX < 0 || nextX >= grid.size() || nextY < 0 || nextY >= grid[0].size()) continue;dfs(grid, vis, nextX, nextY);}
}int main() {int n, m, res = 0;cin >> n >> m;vector<vector<int>> grid(n, vector<int>(m, 0));vector<vector<bool>> vis(n, vector<bool>(m, false));for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {cin >> grid[i][j];}}for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {if (!vis[i][j] && grid[i][j] == 1) {res++;dfs(grid, vis, i, j);}}}cout << res << endl;
}

使用广度优先搜索方法
主函数部分不变,调用变成广度优先搜索
广度优先搜索保证入队列的时候就对数据做标记为访问
如果在取出队列时候标记会导致大量重复元素入队!

#include <iostream>
#include <vector>
#include <queue>
using namespace std;int dir[4][2] = {0,-1,-1,0,1,0,0,1};
void bfs(vector<vector<int>>& grid, vector<vector<bool>>& vis, int x, int y) {// 创建队列存储下标queue<pair<int, int>> que;// 保证入队的时候就标记访问防止重复访问que.push(make_pair(x, y));while (!que.empty()) {pair<int, int> cur = que.front();que.pop();for (int i = 0; i < 4; ++i) {int nextX = cur.first + dir[i][0];int nextY = cur.second + dir[i][1];if (nextX < 0 || nextX >= grid.size() || nextY < 0 || nextY >= grid[0].size()) continue;if (!vis[nextX][nextY] && grid[nextX][nextY] == 1) {que.push({nextX, nextY});vis[nextX][nextY] = true; // 入队即标记防止重复}}}
}int main() {int n, m, res = 0;cin >> n >> m;vector<vector<int>> grid(n, vector<int>(m, 0));vector<vector<bool>> vis(n, vector<bool>(m, false));for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {cin >> grid[i][j];}}for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {if (!vis[i][j] && grid[i][j] == 1) {res++;bfs(grid, vis, i, j);}}}cout << res << endl;
}

100. 岛屿的最大面积
岛屿最大面积,给出广度优先搜索,深度优先搜索(A 和 B)
深度优先 B广度优先在函数外初始化记录,深度优先 A 在函数内初始化记录

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;int tmp = 0;
int dir[4][2] = {0,-1,-1,0,1,0,0,1};int bfs(vector<vector<int>>& grid, vector<vector<bool>>& vis, int x, int y) {tmp = 1;queue<pair<int, int>> que;que.push(make_pair(x, y));vis[x][y] = true;while (!que.empty()) {pair<int, int> cur = que.front();que.pop();for (int i = 0; i < 4; ++i) {int nextX = cur.first + dir[i][0];int nextY = cur.second + dir[i][1];if (nextX < 0 || nextX >= grid.size() || nextY < 0 || nextY >= grid[0].size()) continue;if (!vis[nextX][nextY] && grid[nextX][nextY] == 1) {tmp++;que.push({nextX, nextY});vis[nextX][nextY] = true;}}}return tmp;
}void dfs(vector<vector<int>>& grid, vector<vector<bool>>& vis, int x, int y) {// 1 finif (vis[x][y] || grid[x][y] == 0) return;vis[x][y] = true;tmp++;for (int i = 0; i < 4; ++i) {int nextX = x + dir[i][0];int nextY = y + dir[i][1];if (nextX < 0 || nextX >= grid.size() || nextY < 0 || nextY >= grid[0].size()) continue;dfs(grid, vis, nextX, nextY);}
}void dfs2(vector<vector<int>>& grid, vector<vector<bool>>& vis, int x, int y) {// 2for (int i = 0; i < 4; ++i) {int nextX = x + dir[i][0];int nextY = y + dir[i][1];if (nextX < 0 || nextX >= grid.size() || nextY < 0 || nextY > grid[0].size()) continue;if (!vis[nextX][nextY] && grid[nextX][nextY] == 1) {tmp++;vis[nextX][nextY] = true;dfs2(grid, vis, nextX, nextY);}}
}int main(){int n, m, res = 0, maxV = 0;cin >> n >> m;vector<vector<int>> grid(n, vector<int>(m, 0));vector<vector<bool>> vis(n, vector<bool>(m, false));for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {cin >> grid[i][j];}}for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {if (!vis[i][j] && grid[i][j] == 1) {res++;// 深度优先 1// tmp = 0; // 因为dfs内首先计算tmp// dfs(grid, vis, i, j);// maxV = max(maxV, tmp);// 深度优先 2tmp = 1; // dfs需要初始vis[i][j] = true;dfs2(grid, vis, i, j);maxV = max(maxV, tmp);// 广度优先// maxV = max(maxV, bfs(grid, vis, i, j));}}}// cout << "res" << res << endl;cout << maxV << endl;return 0;
}
http://www.xdnf.cn/news/7247.html

相关文章:

  • 开源模型应用落地-模型上下文协议(MCP)-Resource Template-资源模板的使用逻辑(六)
  • 【TTS回顾】深度剖析 TTS 合成效果的客观评估与主观评价
  • 星际争霸小程序:用Java实现策略模式的星际大战
  • 大模型在股骨干骨折诊疗全流程中的应用研究报告
  • 多卡跑ollama run deepseek-r1
  • DRIVEGPT4: 通过大语言模型实现可解释的端到端自动驾驶
  • 数据治理进阶:精读数据治理培训方案【附全文阅读】
  • 我用 CodeBuddy 打造了一个灵感收集应用 —— SparkNotes 开发实录
  • 一周快讯 | 银发文娱旅游一周新鲜事
  • 【日常笔记】wps如何将值转换成东西南北等风向汉字
  • python fastapi + react, 写一个图片 app
  • Cryosparc里头restack的妙用
  • Linux项目部署全攻略:从环境搭建到前后端部署实战
  • 计算机网络-HTTP与HTTPS
  • Java资源管理与防止泄漏:从SeaTunnel源码看资源释放
  • lowcoder数据库操作1:链接目标数据库
  • 深度学习在移动开发中的应用:实时图像分割实战
  • 从代码学习深度学习 - 用于预训练词嵌入的数据集 PyTorch版
  • WEB安全--SQL注入--MSSQL注入
  • OpenCV 环境搭建与概述
  • Golang的网络安全策略实践
  • TeaType 奶茶性格占卜机开发记录:一场俏皮的 UniApp 单页奇遇
  • 小红书的视频怎么保存没有水印(方法分享)
  • 云鼎入鼎系统:一站式电商管理解决方案
  • bisheng系列(一)- 本地部署(Docker)
  • Kotlin Compose Button 实现长按监听并实现动画效果
  • React Flow 中 Minimap 与 Controls 组件使用指南:交互式小地图与视口控制定制(含代码示例)
  • 精益数据分析(68/126):数据透视表实战与解决方案验证——从问卷分析到产品落地的关键跨越
  • liunx定时任务,centos定时任务
  • eMMC深度解析:嵌入式多媒体卡的硬件电路设计要点