广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++使用回溯法解决黄金矿工问题
  • 758
分享到

C++使用回溯法解决黄金矿工问题

2024-04-02 19:04:59 758人浏览 安东尼
摘要

目录题目描述示例解题思路顺心的人大抵一样,坎坷的人各有各的坎坷。也只能坚持自我修行,等待自己的机遇。 题目描述 你要开发一座金矿,地质勘测学家已经探明了这座金矿中的资源分布,并用大小

顺心的人大抵一样,坎坷的人各有各的坎坷。也只能坚持自我修行,等待自己的机遇。

题目描述

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

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

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

链接:https://LeetCode.cn/problems/path-with-maximum-Gold (力扣)

示例

解题思路

这是一道典型的矩阵 回溯 的题目,依旧是回溯三步走:

1. 回溯函数参数:

  • int[][] grid 表示金矿的矩阵
  • int gold 表示当前路径收集到的金子的总和
  • int x, int y 表示收集到了第 grid[x][y] 位置

下面让我们来思考一个问题:本题需要建立一个 boolean[][] used 备忘录嘛?

备忘录是一定需要的,但是对本题来说,可以通过把已经遍历过的 grid[x][y] 的值改为 0,以此来实现备忘录,这样更能节省空间。

2. 结束条件:

当前遍历位置(x,y)越界,或者当前遍历位置没有金子(grid[x][y] == 0)时,结束return。

3. 单层逻辑:

int temp = grid[x][y]; // 记录值,以便回溯时恢复
gold += grid[x][y]; // 将当前值加入 gold 和中
max = Math.max(max, gold); // 更新结果
grid[x][y] = 0; // 将 grid[x][y] 置为0,防止出现同一重复重复使用

然后递归调用4次 dfs()函数,分布对应从 (x,y)向上下左右前进

回溯部分:

grid[x][y] = temp; // 回溯,恢复 grid[x][y] 

代码:

class Solution {
    int max = Integer.MIN_VALUE;
    public int getMaximumGold(int[][] grid) {
        for(int i=0; i<grid.length; i++){
            for (int j=0; j<grid[0].length; j++){
                if(grid[i][j] != 0) { // 从每个非0位置都可以开始
                    dfs(grid, 0, i, j);
                }
            }
        }
        return max==Integer.MIN_VALUE?0:max;
    }
    public void dfs(int[][] grid, int gold, int x, int y){
        if(!isOk(grid, x, y)){ // 判断是否越界或到无金子位置,结束
            return;
        }
        int temp = grid[x][y];
        gold += grid[x][y];
        max = Math.max(max, gold); // 更新最大值
        grid[x][y] = 0; // 防止出现重复遍历
        dfs(grid, gold, x+1, y); //向上
        dfs(grid, gold, x-1, y); //向下
        dfs(grid, gold, x, y+1); //向左
        dfs(grid, gold, x, y-1); // 向右
        grid[x][y] = temp; // 回溯
    }
	// 判断是否越界 或 走到了无金子位置
    public boolean isOk(int[][] grid, int x, int y){
        if(x<0 || x>=grid.length || y<0 || y>=grid[0].length || grid[x][y] == 0){
            return false;
        }
        return true;
    }
}

本题类似的题还有岛屿问题,可以移步到 岛屿问题

到此这篇关于c++使用矩阵回溯法解决黄金矿工问题的文章就介绍到这了,更多相关C++黄金矿工内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++使用回溯法解决黄金矿工问题

本文链接: https://www.lsjlt.com/news/168898.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++使用回溯法解决黄金矿工问题
    目录题目描述示例解题思路顺心的人大抵一样,坎坷的人各有各的坎坷。也只能坚持自我修行,等待自己的机遇。 题目描述 你要开发一座金矿,地质勘测学家已经探明了这座金矿中的资源分布,并用大小...
    99+
    2022-11-13
  • C++回溯算法中子集问题如何解决
    这篇文章主要介绍了C++回溯算法中子集问题如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++回溯算法中子集问题如何解决文章都会有所收获,下面我们一起来看看吧。一、子集子集问题与其它问题最大的不同就是:...
    99+
    2023-07-05
  • C++回溯算法中的全排列问题怎么解决
    本文小编为大家详细介绍“C++回溯算法中的全排列问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++回溯算法中的全排列问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、全排列全排列的特点...
    99+
    2023-07-05
  • C语言如何使用回溯法解八皇后问题
    这篇文章给大家分享的是有关C语言如何使用回溯法解八皇后问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。八皇后问题(N皇后问题)的回溯法求解一、问题描述在一个国际象棋棋盘上放置八个皇后,使得任何两个皇后之间不相互...
    99+
    2023-06-22
  • C++回溯算法中组合的相关问题怎么解决
    这篇文章主要讲解了“C++回溯算法中组合的相关问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++回溯算法中组合的相关问题怎么解决”吧!回溯算法模板void backtracki...
    99+
    2023-07-05
  • C++回溯与分支限界算法分别解决背包问题详解
    目录算法思想回溯代码分支限界代码算法思想 分支限界法与回溯法的求解目标不同。 回溯法的求解目标是找出解空间中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,...
    99+
    2022-11-13
  • Java使用递归回溯完美解决八皇后的问题
    八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:...
    99+
    2022-11-12
  • 怎么使用Java递归回溯解决八皇后的问题
    这篇文章主要介绍“怎么使用Java递归回溯解决八皇后的问题”,在日常操作中,相信很多人在怎么使用Java递归回溯解决八皇后的问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用Java递归回溯解决八皇后...
    99+
    2023-06-25
  • SpringBoot工程下使用OpenFeign常见问题及解决方法
    这篇文章主要讲解了“SpringBoot工程下使用OpenFeign常见问题及解决方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot工程下使用OpenFeign常见问题及...
    99+
    2023-06-20
  • c#使用listbox的详细方法和常见问题解决
    关于ListBox ListBox是WinForm中的列表控件,它提供了一个项目列表(一组数据项),用户可以选择一个或者多个条目,当列表项目过多时,ListBox会自动添加滚动条,使...
    99+
    2022-11-12
  • 如何使用C#算法解决求第n个数值问题
    这篇文章主要为大家展示了“如何使用C#算法解决求第n个数值问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用C#算法解决求第n个数值问题”这篇文章吧。已知数列:1,1,2,3,5,8,1...
    99+
    2023-06-18
  • 解决@Test注解在Maven工程的Test.class类中无法使用的问题
    目录@Test注解在Maven的Test.class类中无法使用异常背景异常信息异常分析解决方案Maven工程找不到@Testmaven的scope范围如下依赖的传递@Test注解在...
    99+
    2022-11-13
  • 多种方法解决win7使用过程中提示已停止工作问题
      在使用WIN7系统的时候大家可能经常遇到过各种“已停止工作”的提示,如ie已停止工作、word停止工作等等诸如此类的程序错误,非常烦人,那么怎么解决这个问题呢小编下面提供4种处理方案,某些方法...
    99+
    2023-06-01
    win7 已停止工作 过程 使用 工作 问题
  • 解决Map集合使用get方法返回null抛出空指针异常问题
    目录前言空指针问题原因map.get,小心get出一个空指针前言 1.Map里面只能存放对象,不能存放基本类型,例如int,需要使用Integer 2.Map集合取出时,如果变量声明...
    99+
    2022-11-12
  • 使用C#二维数组时内索引数错误问题的解决方法
    本篇内容主要讲解“使用C#二维数组时内索引数错误问题的解决方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“使用C#二维数组时内索引数错误问题的解决方法”吧!今天又用到了C#二维数组,好久没用了...
    99+
    2023-06-18
  • C#中如何使用程序集和DLL文件解决代码模块化问题及解决方法
    C#中如何使用程序集和DLL文件解决代码模块化问题及解决方法在C#开发中,代码模块化是很重要的,它可以将代码分成较小的可重用模块,提高代码的可读性和维护性。为了实现代码模块化,C#提供了程序集和DLL文件的概念。程序集是一组相关的代码文件的...
    99+
    2023-10-22
    程序集 (Assembly) DLL文件 (Dynamic Link Library) 代码模块化 (Code Modu
  • Android Studio finish()方法的使用与解决app点击“返回”,即直接退出的问题
    在这里,我们将用到finish(),简单介绍一下它的使用: finish()官方解析:Call this when your activity ...
    99+
    2022-06-06
    Android Studio studio 方法 finish app Android
  • Python结巴中文分词工具使用过程中遇到的问题及解决方法
    本文实例讲述了Python结巴中文分词工具使用过程中遇到的问题及解决方法。分享给大家供大家参考,具体如下: 结巴分词是Python语言中效果最好的分词工具,其功能包括:分词、词性标注、关键词抽取、支持用户词...
    99+
    2022-06-04
    分词 结巴 解决方法
  • Win10系统网络诊断工具在哪?Win10系统诊断工具解决上网问题的使用方法图文教程
    在电脑使用中,我们经常会遇到一些莫名的网络问题,比如“连接不可用”、“找不到可用网络”或者是“网络连接受限”。导致网络不可用,有时候是网络本身的问题...
    99+
    2023-05-22
    win10网络修复工具 win10无法连接wifi
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作