网格图–Day03–网格图DFS–2658. 网格图中鱼的最大数目,1034. 边界着色,1020. 飞地的数量

今天要训练的题目类型是:【网格图DFS】,题单来自@灵艾山茶府。

适用于需要计算连通块个数、大小的题目。

部分题目做法不止一种,也可以用 BFS 或并查集解决。

DFS函数中的三步曲:判断,处理,继续DFS

  • 判断:是否越界,是否是需要DFS的格子
  • 处理:根据题意处理格子
  • 继续DFS:DFS四个方向,有时候可能需要收集返回值。

2658. 网格图中鱼的最大数目

思路:

题意转换:0是水,val是陆地宝藏的数值,找到有最大数值宝藏的陆地。

是不是理解起来就简单多了?

遍历每一块陆地,对比它的价值。找到最大价值。

class Solution {// 题意转换:0是水,val是陆地宝藏的数值,找到有最大数值宝藏的陆地。private final int[][] DIRS = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 } };private int dfs(int[][] grid, int i, int j) {if (i < 0 || j < 0 || i >= grid.length || j >= grid[0].length || grid[i][j] == 0) {return 0;}int val = grid[i][j];// 标记为已访问grid[i][j] = 0;// 用foreach写,看起来更简洁了for (int[] d : DIRS) {val += dfs(grid, i + d[0], j + d[1]);}return val;}public int findMaxFish(int[][] grid) {int n = grid.length;int m = grid[0].length;int res = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (grid[i][j] != 0) {int val = dfs(grid, i, j);res = Math.max(res, val);}}}return res;}
}

1034. 边界着色

思路:

题目非常啰嗦且复杂,感觉在做阅读题…………

题意:给指定陆地描边

  • DFS染色的时候,先染在temp矩阵上,dfs完之后再转移回去到grid,不然会影响遍历。复杂很多。
  • 题目说的边界要求:
    • 情况一:上下左右,只要有跟自己的color不同的,就算边界。染色!
    • 情况二:当前格子在边界上,就算边界。染色!
  • DFS下一个节点:要和本节点颜色相同,且没访问过的节点,才能进去。
  • 最后DFS完了,将temp上染色的格子,染回去grid
class Solution {// 题意:给指定陆地描边private final int[][] DIRS = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 } };// 染色,先染在temp上,dfs完之后再转移回去到grid,不然会影响遍历。复杂很多。private void dfs(int[][] grid, int i, int j, int color, boolean[][] visited, int[][] temp) {// 标记已访问visited[i][j] = true;// 情况一:上下左右,只要有跟自己的color不同的,就算边界。染色!int cur = grid[i][j];if (i - 1 >= 0 && grid[i - 1][j] != cur|| i + 1 < grid.length && grid[i + 1][j] != cur|| j - 1 >= 0 && grid[i][j - 1] != cur|| j + 1 < grid[0].length && grid[i][j + 1] != cur) {temp[i][j] = color;}// 情况二:格子在边界上,就算边界。染色!if (i == 0 || j == 0 || i == grid.length - 1 || j == grid[0].length - 1) {temp[i][j] = color;}for (int k = 0; k < DIRS.length; k++) {int x = i + DIRS[k][0];int y = j + DIRS[k][1];// xy越界if (x < 0 || y < 0 || x >= grid.length || y >= grid[0].length) {continue;}// 下一个没访问过的节点,且这个节点要和当前节点是同色的if (!visited[x][y] && grid[x][y] == cur) {dfs(grid, x, y, color, visited, temp);}}}public int[][] colorBorder(int[][] grid, int row, int col, int color) {int n = grid.length;int m = grid[0].length;boolean[][] visited = new boolean[n][m];int[][] temp = new int[n][m];dfs(grid, row, col, color, visited, temp);// dfs完了之后,将temp上染色的格子,染回去gridfor (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (temp[i][j] != 0) {grid[i][j] = temp[i][j];}}}return grid;}
}

思路:

不用temp数组的版本。

关键在于:要先判断节点是否被visited过,再判断上下左右是否不同颜色。

这个顺序不能换。因为如果visited过了,颜色可能已经被改了,判断就会有误。

这个顺序是可以不用temp的原因。

public class Solution {// 题意:给指定陆地描边private final int[][] DIRS = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 } };public int[][] colorBorder(int[][] grid, int row, int col, int color) {int m = grid.length;int n = grid[0].length;boolean[][] visited = new boolean[m][n];dfs(grid, row, col, grid[row][col], color, visited);return grid;}private int dfs(int[][] grid, int i, int j, int curColor, int paintColor,boolean[][] visited) {// 情况一:越界,说明上一个格子是边界if (i < 0 || j < 0 || i >= grid.length || j >= grid[0].length) {return 1;}// 已访问过的单元格if (visited[i][j]) {return 0;}// 这个顺序不能换,要先判断visited,再判断颜色相同。因为如果visited过了,颜色可能已经被改了,判断就会有误。// 情况二:遇到不同颜色的单元格,说明当前单元格是边界if (grid[i][j] != curColor) {return 1;}// 标记为已访问visited[i][j] = true;// 检查四个方向int isBorder = 0;for (int[] d : DIRS) {isBorder += dfs(grid, i + d[0], j + d[1], curColor, paintColor, visited);}// 如果任何一个方向返回1,说明当前单元格是边界,需要着色// 最后才着色if (isBorder > 0) {grid[i][j] = paintColor;}return 0;}
}

1020. 飞地的数量

思路:

题意:求内陆。

陆地中,必须至少有一个格子要碰到边界,否则这个陆地就是所求陆地(内陆)。

  • DFS搜索图中的每一个岛屿,累加返回每个岛屿的面积。
  • 判断岛屿是否接触边界,如果没有接触边界(内陆),就是所求陆地,累加它的面积到res中。
class Solution {// 题意:陆地中,必须至少有一个格子要碰到边界,否则这个陆地就是所求陆地(内陆)。private final int[][] DIRS = { { 0, 1 }, { 1, 0 }, { -1, 0 }, { 0, -1 } };private boolean connect = false;private int dfs(int[][] grid, int i, int j) {// 越界了,证明递归进来之前,是在边界上的。trueif (i < 0 || j < 0 || i >= grid.length || j >= grid[0].length) {connect = true;return 0;}// 0不一定是边界,这俩条件不能合在一起if (grid[i][j] == 0) {return 0;}// 标记已访问grid[i][j] = 0;// DFS累加,求这个岛的面积int area = 1;for (int k = 0; k < DIRS.length; k++) {int x = i + DIRS[k][0];int y = j + DIRS[k][1];area += dfs(grid, x, y);}return area;}public int numEnclaves(int[][] grid) {int n = grid.length;int m = grid[0].length;int res = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {// 在这里进去每次都是一个独立的岛屿,要把connect重置if (grid[i][j] == 1) {connect = false;int area = dfs(grid, i, j);// 如果还是没碰到边界,是所求的岛屿,累加到resif (!connect) {res += area;}}}}return res;}
}

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

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

相关文章

新能源车焊接中发那科机器人保护气省气方法

在新能源汽车制造领域&#xff0c;焊接工艺是保障车身结构强度与安全性的关键环节&#xff0c;发那科焊接机器人凭借高精度与稳定性成为产线主力设备。保护气体消耗在焊接成本中占比显著&#xff0c;寻找高效省气方法成为行业降本增效的核心需求。WGFACS节气装置以智能化控制技…

CornerNet2025再研究---将目标检测问题视作关键点检测与配对

CornerNet于2019年3月份提出&#xff0c;CW近期回顾了下这个在当时引起不少关注的目标检测模型&#xff0c;它的亮点在于提出了一套新的方法论——将目标检测转化为对物体成对关键点(角点)的检测。通过将目标物体视作成对的关键点&#xff0c;其不需要在图像上铺设先验锚框(anc…

【C++】vector(2)

目录 1. insert的实现 2. 迭代器失效 2.1 迭代器失效的两种情况 指向已释放的内存&#xff08;物理失效&#xff09; 元素移动导致迭代器指向错误&#xff08;逻辑失效&#xff09; 2.2 修改代码 3. erase的实现 ​编辑修改代码 4. resize的实现 5. 构造函数 5.1 默认…

机器翻译:python库translatepy的详细使用(集成了多种翻译服务)

更多内容请见: 机器翻译修炼-专栏介绍和目录 文章目录 一、translatepy概述 1.1 translatepy介绍 1.1 安装 二、基本使用 2.1 初始化 `Translator` 2.2 文本翻译 2.3 语言检测 2.4 获取翻译备选方案 2.5 单词音标获取 2.6 语音合成 2.7 例句查询 2.8 拼写检查 三、高级功能 3.…

Spring Bean生命周期的完全指南

简介&#xff1a;超越Bean——揭开Spring Bean的隐秘生活 想象一场复杂宏大的舞台剧。作为观众&#xff0c;我们看到的是最终的演出——一个流畅运行的应用程序。但在这光鲜的幕后&#xff0c;隐藏着一套严谨细致的流程&#xff1a;选角&#xff08;实例化Bean&#xff09;、试…

网络安全A模块专项练习任务九解析

任务九&#xff1a;Linux操作系统安全配置-2任务环境说明&#xff1a; (Linux)系统&#xff1a;用户名root&#xff0c;密码1234561. 设置禁止使用最近用过的6个旧密码&#xff0c;将配置文件中对应的部分截图&#xff1b;编辑/etc/pam.d/system-auth文件&#xff0c;找到passw…

Linex进程管理

一、进程查看命令1.pstree用于查看进程树之间的关系&#xff0c;谁是父进程&#xff0c;谁是子进程&#xff0c;可以清楚的看出来是谁创建了谁语法&#xff1a;pstree [选项] -A各进程树之间的连接以ASCII码字符来连接-U各进程树之间的连接以utf8字符来连接&#xff0c;某些终…

手写MyBatis第47弹:Interceptor接口设计与Invocation上下文传递机制--MyBatis动态代理生成与方法拦截的精妙实现

&#x1f942;(❁◡❁)您的点赞&#x1f44d;➕评论&#x1f4dd;➕收藏⭐是作者创作的最大动力&#x1f91e; &#x1f496;&#x1f4d5;&#x1f389;&#x1f525; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;欢迎留言讨论 &#x1f525;&#x1f525;&…

自动驾驶中的传感器技术37——Lidar(12)

这里对当前Lidar中的一些常见问题进行专项论述。首先以禾赛Lidar为例&#xff0c;列出相关参数&#xff0c;以备论述。 图1 禾赛AT128参数图2 禾赛AT360参数图3 禾赛AT1440参数图4 禾赛AT128可靠性验证项图5 禾赛AT128产品证书1、Lidar的线束是什么&#xff0c;由什么决定&…

Meteor主题友链页面自研

发布于&#xff1a;Eucalyptus-Blog Meteor主题虽然设计简约现代&#xff0c;但由于缺乏原生的友情链接管理功能&#xff0c;许多博主只能将友情链接勉强添加在网站底部&#xff0c;这不仅影响页面美观&#xff0c;也不便于访客查找和互动&#xff1b;为了解决这一痛点&#xf…

QT控件QPlainTextEdit、QTextEdit与QTextBrowser的区别

一.主要功能对比二.关键功能差异1.文本类型支持QPlainTextEdit&#xff1a;仅支持纯文本&#xff08;Plain Text&#xff09;&#xff0c;不处理任何格式&#xff08;如字体、颜色、链接、图片等&#xff09;。文本以原始字符形式存储&#xff0c;适合处理日志、代码、配置文件…

【思考】WSL是什么

WSL WSL是什么呢&#xff1f; WSL 是 windows subsystem for linux 的简写&#xff0c;指的是 windows10 的一个子系统&#xff0c;这个子系统的作用是在 windows 下运行 linux 操作系统。 有了WSL&#xff0c;就可以在 windows10 中运行linux操作系统了。许多在 linux 种运行的…

基于单片机智能饮水机/智能热水壶

传送门 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品题目速选一览表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品题目功能速览 概述 基于单片机的智能饮水机系统通过嵌入式技术实现水温控制、水量监测及用户交互功能。系统采用STM3…

Unity游戏打包——iOS打包基础、传包

本文由 NRatel 历史笔记整理而来&#xff0c;如有错误欢迎指正。 相关参考文档 Unity文档 -> 平台开发 -> IOS https://docs.unity3d.com/cn/2021.3/Manual/iphone.html Unity导出的Xcode 项目的结构 Modifying an Xcode project use Xcode.PBXProject. https://doc…

pyside6小项目:进制转换器

from PySide6.QtUiTools import QUiLoader from PySide6.QtWidgets import QApplication,QWidgetclass MyWindow(QWidget):def __init__(self):super().__init__()self.ui QUiLoader().load(trans.ui)self.ui.show()#stor data type dictionaryself.lengthVar {米:100, 千米:…

再见 K8s!3款开源的云原生部署工具

前文&#xff0c;和大家分享了云原生中的核心工具 K8s&#xff1a; 关于 K8s&#xff1a;入门&#xff0c;这篇就够了 K8s是个好东西&#xff0c;就是上手门槛有点高。这不&#xff0c;需求就来了&#xff1f; 有需求&#xff0c;就有工具。 为了解决K8s的配置难题&#xf…

C++ 快速复习指南(上半部分)

1.基础语法基本结构#include <iostream> 头名 using namesapce std ; 统一使用命名空间 int main () { 程序执行门户 主题内容}基本输出 cout << "string " << endl; // 输出 string 变量和数据类型 格式int intger 10 ;常量的引入 需要在变量…

ArcGIS Pro 地图打包与解包

如果需要在ArcGIS Pro 打包某一个地图文档&#xff0c;在 菜单栏中 点击 共享&#xff0c;点击地图。弹出 打包地图 面板&#xff0c;可以打包到Online、打包到地图包&#xff0c;选择将包保存到文件&#xff0c;修改项目详细信息&#xff0c;点击 包&#xff0c;即可实现打包。…

sunset: twilight靶场

sunset: twilight 来自 <sunset: twilight ~ VulnHub> 1&#xff0c;将两台虚拟机网络连接都改为NAT模式 2&#xff0c;攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.128&#xff0c;靶场IP192.168.23.145 3&#xff0c;对靶机…

【机器学习基础】无监督学习算法的现代演进:从数据探索到智能系统的自主发现能力

1. 引言:无监督学习在人工智能革命中的核心价值 在人工智能技术飞速发展的今天,无监督学习正在成为推动AI系统实现真正智能的关键技术。与需要大量标注数据的监督学习不同,无监督学习能够从原始数据中自主发现隐藏的模式和结构,这种能力使其在现代AI应用中具有不可替代的价…