回溯算法解黄金矿工问题

阅读: 评论:0

回溯算法解黄金矿工问题

回溯算法解黄金矿工问题

问题描述

你要开发一座金矿,地质勘测学家已经探明了这座金矿中的资源分布,并用大小为 m * n 的网格 grid 进行了标注。每个单元格中的整数就表示这一单元格中的黄金数量;如果该单元格是空的,那么就是 0。
为了使收益最大化,矿工需要按以下规则来开采黄金:
每当矿工进入一个单元,就会收集该单元格中的所有黄金。
矿工每次可以从当前位置向上下左右四个方向走。
每个单元格只能被开采(进入)一次。
不得开采(进入)黄金数目为 0 的单元格。
矿工可以从网格中 任意一个 有黄金的单元格出发或者是停止

代码:

public class GoldMiner {public static void main(String[] args) {// int [][]grid={{0,6,0},{5,8,7},{0,9,0}};//  int [][]grid={{9,6,0},{5,8,7},{9,9,9}};int [][]grid ={{1,0,7},{2,0,6},{3,4,5},{0,3,0},{9,0,20}};int res=getMaximumGold(grid);System.out.println(res);}public static int getMaximumGold(int[][] grid) {//边界条件判断if (grid == null || grid.length == 0)return 0;//保存最大路径值int res = 0;//两个for循环,遍历每一个位置,让他们当做起点//查找最大路径值for (int i = 0; i < grid.length; i++) {for (int j = 0; j < grid[0].length; j++) {//函数dfs是以坐标(i,j)为起点,查找最大路径值res = Math.max(res, dfs(grid, i, j));}}//返回最大路径值return res;}public static int dfs(int[][] grid, int x, int y) {//边界条件的判断,x,y都不能越界,同时当前坐标的位置如果是0,表示有障碍物//或者遍历过了if (x < 0 || x >= grid.length || y < 0 || y >= grid[0].length || grid[x][y] == 0)return 0;//先把当前坐标的值保存下来,最后再还原int temp = grid[x][y];//当前坐标已经访问过了,要把他标记为0,防止再次访问grid[x][y] = 0;//然后沿着当前坐标的上下左右4个方向查找int up = dfs(grid, x, y - 1);//往上找int down = dfs(grid, x, y + 1);//往下找int left = dfs(grid, x - 1, y);//往左找int right = dfs(grid, x + 1, y);//往右找//这里只要4个方向的最大值即可int max = Math.max(left, Math.max(right, Math.max(up, down)));//然后再把当前位置的值还原grid[x][y] = temp;//返回最大路径值return grid[x][y] + max;}
}

结果:

28

原文地址 回溯算法解黄金矿工问题

本文发布于:2024-01-31 17:06:01,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170669196030070.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:算法   黄金矿工
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23