代码随想录day52图论3

文章目录

  • 101. 孤岛的总面积
  • 102. 沉没孤岛
  • 103. 水流问题
  • 104.建造最大岛屿

101. 孤岛的总面积

题目链接
文章讲解

#include<bits/stdc++.h>
using namespace std;int ans = 0;       // 记录不与边界相连的孤岛数量
int sum = 0;       // 当前孤岛的面积
bool flag = false; // 标记当前孤岛是否与边界相连
// 方向数组:右,下,左,上
int direct[4][2] = {0, 1, 1, 0, -1, 0, 0, -1};// 广度优先搜索(BFS)函数,用于遍历连通区域
void bfs(vector<vector<int>>& grid, vector<vector<bool>>& visit, int x, int y)
{queue<pair<int, int>> q;q.push({x, y});visit[x][y] = true;while(!q.empty()){pair<int, int> cur = q.front();q.pop();int curx = cur.first;int cury = cur.second;// 遍历四个方向for(int i = 0; i < 4; i++){int nextx = curx + direct[i][0];int nexty = cury + direct[i][1];// 如果下一个位置越界,跳过if(nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;// 如果该位置是陆地且未访问过if(grid[nextx][nexty] == 1 && !visit[nextx][nexty]){q.push({nextx, nexty});  // 将新的位置加入队列visit[nextx][nexty] = true;  // 标记该位置为已访问sum++;  // 当前孤岛的面积加一// 如果当前孤岛接触到边界,则设置标记为 trueif(nextx == 0 || nextx == grid.size() - 1 || nexty == 0 || nexty == grid[0].size() - 1)flag = true;}}}
}int main(){int n, m;cin >> n >> m;  // 输入网格的行数和列数// 初始化网格和访问标记数组vector<vector<int>> grid(n, vector<int>(m, 0));  // 网格,0表示水域,1表示陆地vector<vector<bool>> visit(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 = 1; i < n - 1; i++)  // 遍历行,从第2行到倒数第2行{for(int j = 1; j < m - 1; j++)  // 遍历列,从第2列到倒数第2列{// 如果当前位置是陆地且未访问过,启动 BFS 遍历该连通区域if(!visit[i][j] && grid[i][j] == 1){sum = 1;  // 当前孤岛的面积从1开始(包括当前位置)flag = false;  // 初始化标记,假设该孤岛不与边界相连bfs(grid, visit, i, j);  // 执行 BFS,遍历孤岛// 如果该孤岛没有接触到边界,则将其计入最终结果if(!flag) ans += sum;}}}// 输出最终结果:不与边界相连的孤岛总面积cout << ans;
}

102. 沉没孤岛

题目链接
文章讲解

#include<bits/stdc++.h>
using namespace std;bool flag;  // 标记当前岛屿是否与边界相连
int direct[4][2] = {0, 1, 1, 0, -1, 0, 0, -1};  // 方向数组:右、下、左、上// BFS 用于遍历并判断孤岛是否与边界相连
void bfs(vector<vector<int>>& grid, vector<vector<bool>>& visit, int x, int y)
{queue<pair<int, int>> q;q.push({x, y});visit[x][y] = true;// 如果岛屿接触到边界,标记为与边界相连if(x == 0 || x == grid.size() - 1 || y == 0 || y == grid[0].size() - 1)flag = true;// 开始 BFS 遍历while(!q.empty()){pair<int, int> cur = q.front();q.pop();int curx = cur.first;int cury = cur.second;// 遍历四个方向for(int i = 0; i < 4; i++){int nextx = curx + direct[i][0];int nexty = cury + direct[i][1];// 如果下一个位置越界,跳过if(nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;// 如果是陆地且未访问过if(grid[nextx][nexty] == 1 && !visit[nextx][nexty]){q.push({nextx, nexty});visit[nextx][nexty] = true;// 如果接触到边界,将 flag 设置为 trueif(nextx == 0 || nextx == grid.size() - 1 || nexty == 0 || nexty == grid[0].size() - 1)flag = true;}}}
}// BFS2 用于将不与边界相连的岛屿沉没
void bfs2(vector<vector<int>>& grid, vector<vector<bool>>& visit, int x, int y)
{queue<pair<int, int>> q;q.push({x, y});visit[x][y] = true;grid[x][y] = 0;  // 沉没该岛屿部分// 开始 BFS 沉没孤岛while(!q.empty()){pair<int, int> cur = q.front();q.pop();int curx = cur.first;int cury = cur.second;// 遍历四个方向for(int i = 0; i < 4; i++){int nextx = curx + direct[i][0];int nexty = cury + direct[i][1];// 如果下一个位置越界,跳过if(nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;// 如果是陆地且未访问if(grid[nextx][nexty] == 1){q.push({nextx, nexty});visit[nextx][nexty] = true;grid[nextx][nexty] = 0;  // 沉没该岛屿部分}}}
}int main(){int n, m;cin >> n >> m;  // 输入网格的行数和列数vector<vector<int>> grid(n, vector<int>(m, 0));  // 网格初始化,默认都是水域(0)vector<vector<bool>> visit(n, vector<bool>(m, false));  // 访问标记数组// 输入网格数据,1 表示陆地,0 表示水域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++){// 对每个未访问过的陆地执行 BFSif(!visit[i][j] && grid[i][j] == 1)  {flag = false;  // 假设当前孤岛不与边界相连bfs(grid, visit, i, j);  // 执行 BFS,检查该岛屿是否与边界相连if(!flag)  // 如果孤岛不与边界相连,则将其沉没{bfs2(grid, visit, i, j);}}}}// 输出沉没后的网格for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){cout << grid[i][j];if(j == m - 1) cout << endl;  // 每行末尾换行else cout << " ";  // 每个元素间加空格}}return 0;
}

103. 水流问题

题目链接
文章讲解

#include<bits/stdc++.h>
using namespace std;// 方向数组:右,下,左,上
int direct[4][2] = {0, 1, 1, 0, -1, 0, 0, -1};// BFS 用于遍历网格,找到所有符合条件的点
void bfs(vector<vector<int>>& grid, vector<vector<bool>>& visit, int x, int y) {queue<pair<int, int>> q;q.push({x, y});visit[x][y] = true;while (!q.empty()) {auto cur = q.front();q.pop();int curx = cur.first;int cury = cur.second;// 遍历四个方向for (int i = 0; i < 4; i++) {int nextx = curx + direct[i][0];int nexty = cury + direct[i][1];// 边界检查if (nextx < 0 || nexty < 0 || nextx >= grid.size() || nexty >= grid[0].size())continue;// 如果满足条件且未访问过if (grid[nextx][nexty] >= grid[curx][cury] && !visit[nextx][nexty]) {q.push({nextx, nexty});visit[nextx][nexty] = true;}}}
}int main() {int n, m;cin >> n >> m;// 初始化 grid,二维矩阵,初值为 0vector<vector<int>> grid(n, vector<int>(m, 0));// 输入矩阵数据for (int i = 0; i < n; i++)for (int j = 0; j < m; j++)cin >> grid[i][j];// 用于存储从边界流出的区域vector<vector<bool>> lb(n, vector<bool>(m, false));vector<vector<bool>> rb(n, vector<bool>(m, false));// 从上边界和下边界出发进行 BFSfor (int i = 0; i < m; i++) {bfs(grid, lb, 0, i);    // 从上边界bfs(grid, rb, n - 1, i); // 从下边界}// 从左边界和右边界出发进行 BFSfor (int i = 0; i < n; i++) {bfs(grid, lb, i, 0);    // 从左边界bfs(grid, rb, i, m - 1); // 从右边界}// 输出可以同时从第一组和第二组边界流出的坐标for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (lb[i][j] && rb[i][j]) {cout << i << " " << j << endl;}}}return 0;
}

104.建造最大岛屿

题目链接
文章讲解
先遍历所有的陆地块 1,用 BFS 把每个岛屿标记为不同的编号(从 2 开始),并记录每个岛屿的面积。

遍历所有的水块 0,尝试将其变成 1,并计算其上下左右 4 个方向连接的不同岛屿编号的面积和,得到变换后的最大面积。

特判:如果原始矩阵全是陆地,则直接返回 n * m。

#include <iostream>
#include <vector>
#include <unordered_map>
#include <unordered_set>
#include <queue>
using namespace std;int n, m;
int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 右 下 左 上// BFS 标记岛屿 & 计算面积
int bfs(vector<vector<int>>& grid, vector<vector<bool>>& visited, int x, int y, int mark) {int area = 0;queue<pair<int, int>> q;q.push({x, y});visited[x][y] = true;grid[x][y] = mark;while (!q.empty()) {auto [cx, cy] = q.front(); q.pop();area++;for (int i = 0; i < 4; i++) {int nx = cx + dir[i][0];int ny = cy + dir[i][1];if (nx >= 0 && nx < n && ny >= 0 && ny < m &&!visited[nx][ny] && grid[nx][ny] == 1) {q.push({nx, ny});visited[nx][ny] = true;grid[nx][ny] = mark;}}}return area;
}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];vector<vector<bool>> visited(n, vector<bool>(m, false));unordered_map<int, int> area_map; // mark -> areaint mark = 2; // 岛屿编号从2开始// Step 1: 标记岛屿编号并统计面积for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {if (!visited[i][j] && grid[i][j] == 1) {int area = bfs(grid, visited, i, j, mark);area_map[mark] = area;mark++;}}}// Step 2: 尝试将每个水块变为陆地,记录最大面积int max_area = 0;bool all_land = true;for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {if (grid[i][j] == 0) {all_land = false;unordered_set<int> seen; // 记录周围不同的岛屿int total = 1; // 当前水变陆地后的初始面积为1for (int d = 0; d < 4; ++d) {int ni = i + dir[d][0];int nj = j + dir[d][1];if (ni >= 0 && ni < n && nj >= 0 && nj < m) {int neighbor_mark = grid[ni][nj];if (neighbor_mark > 1 && !seen.count(neighbor_mark)) {total += area_map[neighbor_mark];seen.insert(neighbor_mark);}}}max_area = max(max_area, total);}}}// 如果全是陆地,没有任何水块if (all_land) {cout << n * m << endl;} else {cout << max_area << endl;}return 0;
}

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

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

相关文章

linux pip/conda 修改默认cache位置

1 pip pip cache默认在/home/{username}目录下&#xff0c;容易导致系统盘写满报错。查看pip cache位置pip cache dir假设移动pip cache目录到 /data/.cache/pip/cache&#xff0c;命令如下pip config set global.cache-dir /data/.cache/pip/cache2 conda 查看conda缓存位置c…

如何解决pip安装报错ModuleNotFoundError: No module named ‘seaborn’问题

【Python系列Bug修复PyCharm控制台pip install报错】如何解决pip安装报错ModuleNotFoundError: No module named ‘seaborn’问题 一、摘要 在使用 PyCharm 终端进行模块安装时&#xff0c;常常会遇到如下异常&#xff1a; ModuleNotFoundError: No module named ‘seaborn’…

(思维)洛谷 P13551 ももいろの鍵 题解

题意 爱莉给了你一个非负整数 nnn&#xff0c;你需要把 0,1,2,…,n0, 1, 2, \dots, n0,1,2,…,n 划分成若干组&#xff0c;满足每一组的按位与为 000。 划分的组不需要相邻。 你需要最大化划分组数并给出方案。 1≤T≤6001 \le T \le 6001≤T≤600&#xff0c;0≤n≤1050 \le n…

记录一次ESP32报错Guru Meditation Error: Core 1 panic‘ed (Double exception).

一、问题描述 需求&#xff1a; ESP32S3单片机&#xff0c;连接一个麦克风读取5s后&#xff0c;编码后发送到百度云进行语音识别。通过freertos框架&#xff0c;将任务放在核1中运行&#xff08;放在核0同样报错&#xff09; 问题&#xff1a; 在最后的发送语音数据中&#xff…

半导体物理复习

半导体物理导论第一章 半导体的电子状态

vi/vim跳转到指定行命令

在 vi/vim 中跳转到指定行有多种高效方法&#xff0c;以下是最常用的操作方式&#xff1a; 一、基础跳转&#xff1a;行号 命令命令模式下直接输入行号 按 Esc 切换到命令模式后&#xff0c;输入 :行号 并回车。例如&#xff0c;输入 :100 会直接跳转到第 100 行。使用 G 快捷…

智能落地扇方案:青稞RISC-V电机 MCU一览

在科技飞速发展的今天&#xff0c;智能家居已成为人们生活中不可或缺的一部分&#xff0c;而风扇作为夏日解暑的必备家电&#xff0c;其智能化升级也成为了行业发展的必然趋势。传统落地扇功能单一、操作不便&#xff0c;已难以满足现代消费者对便捷、舒适、节能生活的追求。在…

SQL 中 WHERE 与 HAVING 的用法详解:分组聚合场景下的混用指南

SQL中WHERE与HAVING的用法详解&#xff1a;分组聚合场景下的混用指南 1. WHERE与HAVING的基本区别 在SQL查询中&#xff0c;WHERE和HAVING都是用于过滤数据的子句&#xff0c;但它们的应用时机和作用对象有本质区别&#xff1a; WHERE子句&#xff1a;在分组前对原始数据进行过…

14 - 大语言模型 — 抽取式问答系统 “成长记”:靠 BERT 学本事,从文本里精准 “揪” 答案的全过程(呆瓜版-1号)

目录 1、什么是问答系统&#xff1f; 2、问答系统的核心工作流程 2.1、理解问题&#xff1a;把问题 “翻译” 成机器能懂的形式 2.2、 寻找答案&#xff1a;从信息中定位答案 2.3、生成答案&#xff1a;整理并输出结果 2.4、优化迭代&#xff1a;让系统更 “聪明” 3、主…

Docker一键部署轻量级Gitea仓库

1、安装docker 1、安装依赖包 yum install -y yum-utils device-mapper-persistent-data lvm22、配置docker yum源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo3、安装docker yum install -y docker-ce4、修改docker配置文…

2025年渗透测试面试题总结-2025年HW(护网面试) 81(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 2025年HW(护网面试) 81 一、Webshell获取路径规划 二、变形注入突破技巧 三、MySQL写入Webshell条件矩阵 …

8.1IO进程线程——文件IO函数

文章目录一、思维导图二、使用文件IO函数&#xff0c;实现文件的拷贝myhead.h代码现象三、使用标准IO函数&#xff0c;实现图片的拷贝代码现象四、使用文件IO函数&#xff0c;计算文件的大小代码现象五、牛客网刷题一、思维导图 二、使用文件IO函数&#xff0c;实现文件的拷贝 …

xerces-c-src_2_8_0 arm_linux编译

xerces-c-src_2_8_0 ARM LINUX 编译 文章借鉴&#xff1a;https://bbs.csdn.net/topics/250017321 export XERCESCROOT/xxxx/xerces-c-src_2_8_0 1 下载地址https://archive.apache.org/dist/xerces/c/sources/xerces-c-src_2_8_0.tar.gz&#xff1a;xerces-c-src_2_8_0.tar…

20250729使用WPS打开xlsx格式的电子表格时候隐藏显示fx的编辑栏的方法

20250729使用WPS打开xlsx格式的电子表格时候隐藏显示fx的编辑栏的方法 2025/7/29 9:44缘起&#xff1a;视图→编辑栏 截屏的时候&#xff0c;显示fx的编辑栏 占用空间了&#xff0c;很讨厌。 想办法拿掉&#xff01;

springboot当中ConfigurationProperties注解作用跟数据库存入有啥区别

在Spring Boot中&#xff0c;ConfigurationProperties注解用于将外部配置文件&#xff08;如application.properties或application.yml&#xff09;中的属性映射到Java对象中。这种方式使得配置管理更加灵活和集中。而将配置信息存入数据库则是另一种管理应用程序配置的方式。这…

JVM指针压缩的那些事

什么是指针压缩&#xff1f;指针压缩&#xff08;Compressed Ordinary Object Pointers&#xff0c;简称Compressed OOPs&#xff09;是JVM在64位平台上的一种内存优化技术&#xff0c;它将64位的对象引用压缩为32位&#xff0c;从而减少内存占用并提升性能。为什么需要指针压缩…

【数据结构初阶】--排序(一):直接插入排序,希尔排序

&#x1f525;个人主页&#xff1a;草莓熊Lotso &#x1f3ac;作者简介&#xff1a;C研发方向学习者 &#x1f4d6;个人专栏&#xff1a; 《C语言》 《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》 ⭐️人生格言&#xff1a;生活是默默的坚持&#xff0c;毅力是永久的…

Hive SQL (HQL) 编辑指南

Hive SQL&#xff08;HQL&#xff09;是基于Hive的数据仓库查询语言&#xff0c;语法类似标准SQL&#xff0c;但因Hive的离线大数据处理特性&#xff0c;存在一些特有规则和最佳实践。以下是Hive SQL的编辑指南&#xff0c;涵盖核心语法、注意事项和优化技巧&#xff1a; 一、H…

力扣热题100--------240.搜索二维矩阵

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1&#xff1a;输入&#xff1a;matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24…

【pytest高阶】-2- 内置hook插件扩展机制和定制开发

一、可爱版 pytest 插件 & hook 知识大礼包 &#x1f381;准备好和 pytest 插件来一场可爱约会了吗&#xff5e; 咱们用超甜的 emoji 把知识串成棉花糖&#x1f361; 一口一个知识点&#xff01;一、 pytest 插件&#xff1a;框架的 “魔法百宝箱” &#x1f9d9;‍♀️1. …