Leetcode刷题详解——黄金矿工

1. 题目链接:1219. 黄金矿工

2. 题目描述:

你要开发一座金矿,地质勘测学家已经探明了这座金矿中的资源分布,并用大小为 m * n 的网格 grid 进行了标注。每个单元格中的整数就表示这一单元格中的黄金数量;如果该单元格是空的,那么就是 0

为了使收益最大化,矿工需要按以下规则来开采黄金:

  • 每当矿工进入一个单元,就会收集该单元格中的所有黄金。
  • 矿工每次可以从当前位置向上下左右四个方向走。
  • 每个单元格只能被开采(进入)一次。
  • 不得开采(进入)黄金数目为 0 的单元格。
  • 矿工可以从网格中 任意一个 有黄金的单元格出发或者是停止。

示例 1:

输入:grid = [[0,6,0],[5,8,7],[0,9,0]]
输出:24
解释:
[[0,6,0],
 [5,8,7],
 [0,9,0]]
一种收集最多黄金的路线是:9 -> 8 -> 7。

示例 2:

输入:grid = [[1,0,7],[2,0,6],[3,4,5],[0,3,0],[9,0,20]]
输出:28
解释:
[[1,0,7],
 [2,0,6],
 [3,4,5],
 [0,3,0],
 [9,0,20]]
一种收集最多黄金的路线是:1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7。

提示:

  • 1 <= grid.length, grid[i].length <= 15
  • 0 <= grid[i][j] <= 100
  • 最多 25 个单元格中有黄金。

3. 解法:

3.1 算法思路:

枚举矩阵中所有的位置当成起点,来一次深度优先遍历,统计出所有情况下能收集的黄金数的最大值即可

  1. 初始化访问标记数组 vis,用于记录某个位置是否已经访问过。
  2. 初始化四个方向的横坐标偏移量 dx 和纵坐标偏移量 dy
  3. 获取地图的行数 m 和列数 n
  4. 遍历地图的每一行和每一行的每个位置。
  5. 如果当前位置有金币(即 g[i][j] 不为0),则进行以下操作:
    • 将当前位置标记为已访问(vis[i][j] = true)。
    • 调用深度优先搜索函数 dfs,从当前位置开始进行搜索。
    • 回溯时取消当前位置的标记(vis[i][j] = false)。
  6. 在深度优先搜索函数 dfs 中,执行以下操作:
    • 更新最大金币数量 ret,将其设置为当前路径中的金币数量与 ret 之间的较大值。
    • 遍历四个方向(上、下、左、右)。
    • 计算下一个位置的坐标 xy
    • 如果下一个位置在地图内且未被访问过且有金币(即 g[x][y] 不为0),则进行以下操作:
      • 将下一个位置标记为已访问(vis[x][y] = true)。
      • 继续从下一个位置开始进行深度优先搜索,并将当前路径中的金币数量加上下一个位置的金币数量作为新的路径。
      • 回溯时取消下一个位置的标记(vis[x][y] = false)。
  7. 返回最大金币数量 ret

通过以上步骤,该算法能够找到二维网格中的最大金币数量。

请添加图片描述

3.2 C++算法代码:

class Solution {
    bool vis[16][16]; // 访问标记数组,用于记录某个位置是否已经访问过
    int dx[4]={0,0,1,-1}; // 四个方向的横坐标偏移量
    int dy[4]={1,-1,0,0}; // 四个方向的纵坐标偏移量
    int m,n; // 地图的行数和列数
    int ret; // 记录最大金币数量

public:
    int getMaximumGold(vector<vector<int>>& g) // 获取最大金币数量的函数
    {
        m=g.size(),n=g[0].size(); // 初始化地图的行数和列数
        for(int i=0;i<m;i++) // 遍历地图的每一行
        {
            for(int j=0;j<n;j++) // 遍历每一行的每个位置
            {
                if(g[i][j]) // 如果当前位置有金币
                {
                    vis[i][j]=true; // 标记当前位置已访问
                    dfs(g,i,j,g[i][j]); // 从当前位置开始进行深度优先搜索
                    vis[i][j]=false; // 回溯时取消标记
                }
            }
        }
        return ret; // 返回最大金币数量
    }
    void dfs(vector<vector<int>>&g,int i,int j,int path) // 深度优先搜索函数
    {
        ret=max(ret,path); // 更新最大金币数量
        for(int k=0;k<4;k++) // 遍历四个方向
        {
            int x=i+dx[k],y=j+dy[k]; // 计算下一个位置的坐标
            if(x>=0&&x<m&&y>=0&&y<n&&!vis[x][y]&&g[x][y]) // 如果下一个位置在地图内且未被访问过且有金币
            {
                vis[x][y]=true; // 标记下一个位置已访问
                dfs(g,x,y,path+g[x][y]); // 继续从下一个位置开始进行深度优先搜索
                vis[x][y]=false; // 回溯时取消标记
            }
        }
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库表的设计——范式

目录 1. 设计数据表需要注意的点 2. 范式 2.1 范式简介 2.2 范式有哪些&#xff1f; 2.3 第一范式(1NF) 2.4 第二范式(2NF) 2.5 第三范式(3NF) 2.6 小结 1. 设计数据表需要注意的点 &#xff08;1&#xff09;首先要考虑设计这张表的用途&#xff0c;这张表都要存放什…

博捷芯BJCORE:国内划片机品牌优势

国内划片机品牌在半导体设备制造领域奋起直追&#xff0c;展现出以下几个优势&#xff1a; 1. 技术提升&#xff1a;国内划片机品牌在技术上持续取得突破&#xff0c;例如设备精准度和切割精度的提高&#xff0c;可以在短时间内完成大量加工&#xff0c;提高了生产效率。 2. 适…

【Python Opencv】Opencv画图形

文章目录 前言一、画图形1.1 画线1.2 画矩形1.3 画圆1.4 画椭圆1.5 添加文本 总结 前言 在计算机视觉和图像处理中&#xff0c;OpenCV不仅可以处理图像和视频&#xff0c;还提供了一组功能强大的工具&#xff0c;用于在图像上绘制各种形状和图形。这些功能使得我们能够在图像上…

centos利用find提权反弹shell

需要说明的是利用find命令进行提权的方式已经不存在了&#xff0c;因为Linux默认不会为find命令授予suid权限&#xff0c;这里只是刻意的制造出了一种存在提权的环境 首先我们先介绍一下find命令&#xff0c;find命令主要用来在Linux中查找文件使用&#xff0c;它可以进行最基础…

JVM如何运行,揭秘Java虚拟机运行时数据区

目录 一、概述 二、程序计数器 三、虚拟机栈 四、本地方法栈 五、本地方法接口 六、堆 &#xff08;一&#xff09;概述 &#xff08;二&#xff09;堆空间细分 七、方法区 一、概述 不同的JVM对于内存的划分方式和管理机制存在部分差异&#xff0c;后续针对HotSpot虚…

Brute Force

Brute Force "Brute Force"&#xff08;暴力破解&#xff09;指的是一种通过尝试所有可能的组合来获取访问、解密或破解信息的攻击方法。这种攻击方法通常是基于暴力和不断尝试的&#xff0c;不依赖漏洞或弱点。通常用于破解密码、破坏系统或获取未经授权的访问权限…

【数据结构】链表经典OJ题,常见几类题型(二)

目录 题型三&#xff1a;链表相交&#xff0c;找相交节点思路解析OJ题实例解题代码 题型四&#xff1a;链表带环&#xff0c;找入环节点思路解析OJ实例解题代码 题型三&#xff1a;链表相交&#xff0c;找相交节点 思路解析 看到这类题型首先要判断链表是否相交&#xff0c;而…

密钥安全存储方案探讨与实践

随着信息技术的迅猛发展和应用范围的不断扩大&#xff0c;我们日常生活中的许多方面已经与信息技术密不可分。而在信息安全领域中&#xff0c;密钥的安全存储显得尤为重要。本文将探讨密钥安全存储的必要性、相关技术和实践方案&#xff0c;并提出一些解决方案。 一、密钥安全存…

Redis 常用的类型和 API

前言 在当今的软件开发中&#xff0c;数据存储与操作是至关重要的一部分。为了满足日益增长的数据需求和对性能的追求&#xff0c;出现了许多不同类型的数据库。其中&#xff0c;Redis 作为一种基于内存且高性能的键值存储数据库&#xff0c;因其快速的读取速度、丰富的数据结…

进行 “最佳价格查询器” 的开发(多种并行方式的性能比较)

前置条件 public class Shop {private final String name;private final Random random;public Shop(String name) {this.name name;random new Random(name.charAt(0) * name.charAt(1) * name.charAt(2));}public double getPrice(String product) {return calculatePrice…

第4关:非递归实现二叉树左右子树交换

任务描述相关知识 栈的基本操作二叉树后序遍历编程要求测试说明 任务描述 本关任务&#xff1a;给定一棵二叉树&#xff0c;使用非递归的方式实现二叉树左右子树交换&#xff0c;并输出后序遍历结果。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.栈的基…

PostGIS学习教程一:PostGIS介绍

一、什么是空间数据库 PostGIS是一个空间数据库&#xff0c;Oracle Spatial和SQL Server(2008和之后版本&#xff09;也是空间数据库。 但是这意味着什么&#xff1f;是什么使普通数据库变成空间数据库&#xff1f; 简短的答案是… 空间数据库像存储和操作数据库中其他任何…

C语言文件操作 | 文件分类、文件打开与关闭、文件的读写、文件状态、文件删除与重命名、文件缓冲区

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

UI 自动化测试框架设计与 PageObject 改造!

在 UI 自动化测试过程中&#xff0c;面对复杂的业务场景&#xff0c;经常会遇到这样的挑战&#xff1a; 简单的录制/回放速度快&#xff0c;但无法适应复杂场景&#xff1b;编写自动化测试脚本比较灵活&#xff0c;但工作量大且可维护性差&#xff1b;以往的封装技术&#xff…

Metric

如果 Metric ‘use_polarity&#xff08;使用极性&#xff09;’ &#xff0c;则图像中的对象必须和模型具有相同的对比度&#xff08;Contrast&#xff09;。比如&#xff0c;如果模型是一个在暗/深色背景上的明亮物体&#xff0c;则仅当对象比背景更亮时才会被找到。 如果 …

塑料质量检测是确保产品制造和装配过程的关键环节

激光塑料透光率检测是一种有效的塑料材料特性检测方法。在激光束通过上层透明材料后&#xff0c;被下层材料吸收。上层材料可以是透明的或者是有颜色的&#xff0c;但是必须能够保证有足够的激光通过。 塑料质量检测是确保产品制造和装配过程的关键环节。通过激光塑料透光率检测…

微博开启下一战:降本增效守利润,垂直内容拓营收

微博的商业想象空间正在逐步打开。 近日&#xff0c;微博披露了2023年三季度财报&#xff0c;营收4.422亿美元&#xff0c;同比下跌3%&#xff1b;调整后净利润1.366亿美元&#xff0c;同比增长17%。但若剔除汇率因素影响&#xff0c;微博的整体业绩仍然保持在正向增长轨道。 …

软考网络工程师知识点总结(二)

目录 21、海明码--差错控制 22、CRC循环冗余校验码 23、网络时延的计算 24、根据距离选择传输介质 25、多模光纤和单模光纤的区别 26、CSMA/CD协议 27、以太网帧结构 28、以太网类型及传输介质的选择 29、交换式以太网&#xff08;交换机&#xff09; 30、VLAN虚拟局…

【Python基础】网络编程之Epoll使用一(符实操:基于epoll实现的实时聊天室)

&#x1f308;欢迎来到Python专栏 &#x1f64b;&#x1f3fe;‍♀️作者介绍&#xff1a;前PLA队员 目前是一名普通本科大三的软件工程专业学生 &#x1f30f;IP坐标&#xff1a;湖北武汉 &#x1f349; 目前技术栈&#xff1a;C/C、Linux系统编程、计算机网络、数据结构、Mys…

wpf devexpress设置行和编辑器

如下教程示范如何计算行布局&#xff0c;特定的表格单元编辑器&#xff0c;和格式化显示值。这个教程基于前一个文章 选择行显示 GridControl为所有字段生成行和绑定数据源&#xff0c;如果AutoGenerateColumns 属性选择AddNew。添加行到GridControl精确显示为特别的几行设置。…