【图论算法题记录】岛屿问题汇总

岛屿数量

题目🔗

题目描述

给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。

BFS

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int N = 50;
#define pi pair<int, int>
int grid[N][N];
int dir[4][2] = { -1, 0, 1, 0, 0, -1, 0, 1 };int main() {int n, m;   // 行数,列数cin >> n >> m;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {cin >> grid[i][j];}}vector<vector<int>> visited(n, vector<int>(m, 0));  // 设置访问数组int cnt = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (visited[i][j] == 0 && grid[i][j] == 1) {cnt++;queue<pi> q;q.push(pi(i, j)); visited[i][j] = 1;    // 首先访问(0, 0)while (!q.empty()) {pi cur = q.front(); q.pop();int curx = cur.first;int cury = cur.second;for (int k = 0; k < 4; k++) {int x = curx + dir[k][0];int y = cury + dir[k][1];if (x < 0 || x >= n || y < 0 || y >= m) continue; // 超出索引范围就continueif (visited[x][y] == 0 && grid[x][y] == 1) {visited[x][y] = 1;q.push(pi(x, y));}}}}}}cout << cnt << endl;return 0;
}

DFS

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int N = 50;
#define pi pair<int, int>
int n, m;   // 行数,列数
vector<vector<int>> grid(N, vector<int>(N, 0));
int dir[4][2] = { -1, 0, 1, 0, 0, -1, 0, 1 };void dfs(int curx, int cury, vector<vector<int>>& grid, vector<vector<int>>& visited){for(int i = 0; i < 4; i++){int x = curx + dir[i][0];int y = cury + dir[i][1];if(x < 0 || x >= n || y < 0 || y >= m) continue;if(visited[x][y] == 0 && grid[x][y] == 1){visited[x][y] = 1;dfs(x, y, grid, visited);}}
}int main() {cin >> n >> m;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {cin >> grid[i][j];}}vector<vector<int>> visited(n, vector<int>(m, 0));  // 设置访问数组int cnt = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (visited[i][j] == 0 && grid[i][j] == 1) {visited[i][j] = 1;cnt++;dfs(i, j, grid, visited);}}}cout << cnt << endl;return 0;
}

岛屿的最大面积

题目🔗

题目描述

给定一个由 1(陆地)和 0(水)组成的矩阵,计算岛屿的最大面积。岛屿面积的计算方式为组成岛屿的陆地的总数。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。

BFS

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
#define pi pair<int, int>
int n, m;   // 行数,列数
int dir[4][2] = {-1, 0, 1, 0, 0, -1, 0, 1}; // 上下左右四个方向void bfs(int i, int j, vector<vector<int>>& grid, vector<vector<int>>& visited, int& cur_size){queue<pi> q;q.push(pi(i, j)); visited[i][j] = 1; // 将(i, j)入队,且设为已访问过while(!q.empty()){pi cur = q.front(); q.pop();int curx = cur.first;int cury = cur.second;for(int k = 0; k < 4; k++){int x = curx + dir[k][0];int y = cury + dir[k][1];if(x < 0 || x >= n || y < 0 || y >= m) continue;  // 如果超出索引范围则continueif(visited[x][y] == 0 && grid[x][y] == 1){q.push(pi(x, y));   // 让当前陆地入队visited[x][y] = 1;cur_size++;}}}
}int main(){cin >> n >> m;vector<vector<int>> grid(n, vector<int>(m));for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){cin >> grid[i][j];}}int max_size = 0;vector<vector<int>> visited(n, vector<int>(m, 0));  // 访问数组for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){int cur_size = 0;if(visited[i][j] == 0 && grid[i][j] == 1){  // 如果当前是没有访问过的陆地才进行下面语句cur_size++; // 记录当前面积bfs(i, j, grid, visited, cur_size);max_size = max(max_size, cur_size);}}}cout << max_size << endl;return 0;
}

孤岛的总面积

题目🔗

题目描述

给定一个由 1(陆地)和 0(水)组成的矩阵,岛屿指的是由水平或垂直方向上相邻的陆地单元格组成的区域,且完全被水域单元格包围。孤岛是那些位于矩阵内部、所有单元格都不接触边缘的岛屿。

现在你需要计算所有孤岛的总面积,岛屿面积的计算方式为组成岛屿的陆地的总数。

BFS

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
#define pi pair<int, int>
int n, m;   // 行数,列数
int dir[4][2] = {-1, 0, 1, 0, 0, -1, 0, 1}; // 上下左右四个方向
int island_size = 0;void bfs(int i, int j, vector<vector<int>>& grid){queue<pi> q;q.push(pi(i, j)); grid[i][j] = 0; // 将(i, j)入队,且设为已访问过island_size++;while(!q.empty()){pi cur = q.front(); q.pop();int curx = cur.first;int cury = cur.second;for(int k = 0; k < 4; k++){int x = curx + dir[k][0];int y = cury + dir[k][1];if(x < 0 || x >= n || y < 0 || y >= m) continue;  // 如果超出索引范围则continueif(grid[x][y] == 1){q.push(pi(x, y));   // 让当前陆地入队grid[x][y] = 0;island_size++;}}}
}int main(){cin >> n >> m;vector<vector<int>> grid(n, vector<int>(m));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++){ // 从左边和右边向中间遍历if(grid[i][0] == 1) bfs(i, 0, grid);if(grid[i][m-1] == 1) bfs(i, m-1, grid);}for(int j = 0; j < m; j++){if(grid[0][j] == 1) bfs(0, j, grid);if(grid[n-1][j] == 1) bfs(n-1, j, grid);}island_size = 0;for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){if(grid[i][j] == 1){  // 如果当前是没有访问过的陆地才进行下面语句bfs(i, j, grid);}}}cout << island_size << endl;return 0;
}

沉没孤岛

题目🔗

题目描述

给定一个由 1(陆地)和 0(水)组成的矩阵,岛屿指的是由水平或垂直方向上相邻的陆地单元格组成的区域,且完全被水域单元格包围。孤岛是那些位于矩阵内部、所有单元格都不接触边缘的岛屿。

现在你需要将所有孤岛“沉没”,即将孤岛中的所有陆地单元格(1)转变为水域单元格(0)。

BFS

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
#define pi pair<int, int>
int n, m;   // 行数,列数
int dir[4][2] = {-1, 0, 1, 0, 0, -1, 0, 1}; // 上下左右四个方向
int island_size = 0;void bfs(int i, int j, vector<vector<int>>& grid, int flag){queue<pi> q;q.push(pi(i, j)); grid[i][j] = flag; // 将(i, j)入队,且设为已访问过while(!q.empty()){pi cur = q.front(); q.pop();int curx = cur.first;int cury = cur.second;for(int k = 0; k < 4; k++){int x = curx + dir[k][0];int y = cury + dir[k][1];if(x < 0 || x >= n || y < 0 || y >= m) continue;  // 如果超出索引范围则continueif(grid[x][y] == 1){q.push(pi(x, y));   // 让当前陆地入队grid[x][y] = flag;}}}
}int main(){cin >> n >> m;vector<vector<int>> grid(n, vector<int>(m));for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){cin >> grid[i][j];}}int flag = 2;   // 标记周边岛屿为2for(int i = 0; i < n; i++){ // 从左边和右边向中间遍历if(grid[i][0] == 1) bfs(i, 0, grid, flag);if(grid[i][m-1] == 1) bfs(i, m-1, grid, flag);}for(int j = 0; j < m; j++){if(grid[0][j] == 1) bfs(0, j, grid, flag);if(grid[n-1][j] == 1) bfs(n-1, j, grid, flag);}flag = 0;   // 标记孤岛为0for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){if(grid[i][j] == 1){  // 如果当前是没有访问过的陆地才进行下面语句bfs(i, j, grid, flag);}}}for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){if(grid[i][j] == 2) grid[i][j] = 1;if(j != 0) cout << " " << grid[i][j];else cout << grid[i][j];}cout << endl;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/867937.shtml

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

相关文章

【已解决】CentOS8安装lrzsz报错:Error: Failed to download metadata for repo ‘BaseOS‘

这里写自定义目录标题 系统信息安装lrzsz解决方案开始使用 系统信息 #cat /etc/redhat-release CentOS Linux release 8.1.1911 (Core) 安装lrzsz # yum install lrzsz CentOS-8 - AppStream …

【Threejs进阶教程-优化篇】4.Vue/React与threejs如何解决冲突和卡顿(续)

Vue/React与threejs如何解决冲突和卡顿-续 使用说明核心思路环境搭建(vuethree)vue运行机制分析业务分离使用threejs做背景 3D模块封装使用ES6的Class来让逻辑性更强Threejs尽量按需引入创建一个类扩展写法本次代码执行顺序 扩展内容添加orbitControls和辅助线解决事件覆盖 与V…

C++模板元编程(三)——类型萃取

类型萃取(type_traits)是一种编译时技术&#xff0c;用于在编译期间获取和操作类型的信息&#xff0c;主要用于泛型编程以及在编译时做出决策。 文章目录 常见的类型萃取内部实现std::is_integral\<T\>std::enable_if_t<_Test, T> 应用 常见的类型萃取 在C11的<…

Java请求webService,IDEA生成客户端调用代码

Axis是Apache开放源代码组织的一个项目&#xff0c;全称为Apache Extensible Interaction System&#xff0c;简称Axis。它是一个基于Java的SOAP&#xff08;Simple Object Access Protocol&#xff0c;简单对象访问协议&#xff09;引擎&#xff0c;提供创建服务器端、客户端和…

游戏开发面试题3

unity如何判断子弹射击到敌人&#xff0c;如果子弹特别快怎么办 使用物理学碰撞检测。使用Unity的物理组件&#xff0c;如Rigidbody和Collider&#xff0c;将子弹和敌人都设置为有一定的物理碰撞属性&#xff0c;当子弹碰到敌人的时候&#xff0c;就会触发OnCollisionEnter()事…

游戏开发面试题2

详细说下堆排序。 堆排序是一种选择排序算法&#xff0c;它的基本思想是&#xff1a;将待排序序列构造成一个大顶堆&#xff0c;此时&#xff0c;整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换&#xff0c;此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个…

作业训练二编程题6. 小A的计算器

【问题描述】 以往的操作系统内部的数据表示都是二进制方式&#xff0c;小A新写了一个操作系统&#xff0c;系统内部的数据表示为26进制&#xff0c;其中0-25分别由a-z表示。 现在小A要在这个操作系统上实现一个计算器&#xff0c;这个计算器要能实现26进制数的加法运算…

Ajax与Fetch API在Web开发中的性能、用法与未来趋势比较

Ajax和Fetch都是JavaScript中用于从客户端向服务器发送请求以获取数据的技术&#xff0c;但它们之间存在一些显著的区别。以下是对这两种技术的详细比较&#xff1a; 一、技术基础与实现方式 Ajax&#xff1a; 基础&#xff1a;Ajax全称为Asynchronous JavaScript and XML&…

LabVIEW的Actor Framework (AF) 结构介绍

LabVIEW的Actor Framework (AF) 是一种高级架构&#xff0c;用于开发并发、可扩展和模块化的应用程序。通过面向对象编程&#xff08;OOP&#xff09;和消息传递机制&#xff0c;AF结构实现了高效的任务管理和数据处理。其主要特点包括并发执行、动态可扩展性和强大的错误处理能…

ROS——多个海龟追踪一个海龟实验

目标 通过键盘控制一个海龟&#xff08;领航龟&#xff09;的移动&#xff0c;其余生成的海龟通过监听实现追踪定期获取领航龟和其余龟的坐标信息&#xff0c;通过广播告知其余龟&#xff0c;进行相应移动其余龟负责监听 疑惑点&#xff08;已解决&#xff09; int main(int…

k8s 部署RuoYi-Vue-Plus之redis搭建

1.直接部署一个pod 需要挂载存储款, 可参考 之前文章设置 https://blog.csdn.net/weimeibuqieryu/article/details/140183843 2.部署yaml 先创建命名空间ruoyi, 有就不用创建了 kubectl create namespace ruoyi创建部署文件 redis-deploy.yaml kind: PersistentVolume api…

程序员学长 | 快速学会一个算法,xLSTM

本文来源公众号“程序员学长”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;快速学会一个算法&#xff0c;xLSTM 今天给大家分享一个超强的算法模型&#xff0c;xLSTM。 xLSTM&#xff08;Extended Long Short-Term Memory&…

Spring Boot的无缝衔接:深入解析与实践

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ &#x1f680;The begin&#x1f697;点点关注&#xff0c;收藏不迷路&#x1f6a9; 引言 在快速迭代的软件开发环境中&#xff0c;无缝衔接是提升开发效率、降低维护成本、增强系统稳定性的关键。Spring Boo…

Electron开发 - 如何在主进程Main中让node-fetch使用系统代理

背景 开发过程中&#xff0c;用户设置的系统代理是不同的&#xff0c;比如公司内的服务器&#xff0c;所以就要动态地使用系统代理来访问&#xff0c;但是主进程默认为控制台级别的请求&#xff0c;不走系统代理&#xff0c;除非你指定系统代理配置&#xff0c;这个就就有了这…

轻松上手MYSQL:MYSQL事务隔离级别的奇幻之旅

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》《MYSQL》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 ✨欢迎加入探索MYSQL索引数据结构之旅✨ &#x1f44b; 大家好&#xff01;文本学习…

【话题】IT专业入门,高考假期预习指南

IT专业入门&#xff0c;高考假期预习指南 亲爱的高考学子们&#xff0c; 七月的阳光&#xff0c;如同你们的梦想&#xff0c;炽热而明亮。当你们手中的笔落下最后一道题的答案&#xff0c;那不仅仅是对过去十二年寒窗苦读的告别&#xff0c;更是对未知世界探索的启程号角。你们…

ExtruOnt——为工业 4.0 系统描述制造机械类型的本体

概述 论文地址 &#xff1a;https://arxiv.org/abs/2401.11848 原文地址&#xff1a;https://ai-scholar.tech/articles/ontology/ExtruOnt 在工业 4.0 应用场景中&#xff0c;以机器可解释代码提供的、语义丰富的制造机械描述可以得到有效利用。然而&#xff0c;目前显然还缺…

无锡哲讯:SAP赋能汽车零配件行业,加速企业数字化转型

汽车零配件行业作为汽车工业的重要支撑&#xff0c;正处在一个快速变化和高度竞争的市场环境中。随着科技的不断进步和消费者需求的日益多样化&#xff0c;如何通过高效的资源管理和生产流程优化&#xff0c;提升竞争力&#xff0c;已成为汽车零配件企业亟待解决的问题。无锡哲…

玩转springboot之springboot项目监测

项目监测 springboot中提供了actuator项目来进行监测和度量 基于springboot2.x版本 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId></dependency> actuator中提…

【数智化人物展】天云数据CEO雷涛:大模型连接数据库 为数智化提供高价值数据...

雷涛 本文由天云数据CEO雷涛投递并参与由数据猿联合上海大数据联盟共同推出的《2024中国数智化转型升级先锋人物》榜单/奖项评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 这几天&#xff0c;奥特曼讲SQL数据库和大模型结合起来会产生什么样的化学变化引起行业关注。为…