Skip to content

黄金矿工-1219 #105

@sl1673495

Description

@sl1673495

你要开发一座金矿,地质勘测学家已经探明了这座金矿中的资源分布,并用大小为  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。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/path-with-maximum-gold
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

题目很好玩,看起来像游戏一样,但是本质上还是在一个「二维矩阵」中做递归回溯的求解。

分别尝试以任意一个不为 0的格子作为起点,不断的向「上、下、左、右」四个方向继续的递归求解,一旦遇到边界了(比如超出边界,或者当前格子为 0 了)就把目前得到的值和全局的最大值 maxGold 比较,更新最大值

考虑清楚每次遍历四周的格子前的判断条件:

  1. 范围不能越界
  2. 本轮递归中未访问过
  3. 下一个格子的值不能为 0
/**
 * @param {number[][]} grid
 * @return {number}
 */
let getMaximumGold = function (grid) {
  let maxY = grid.length
  if (maxY === 0) {
    return 0
  }
  let maxX = grid[0].length

  let visited = []
  for (let y = 0; y < maxY; y++) {
    visited[y] = []
  }

  let dirs = [[1, 0],[-1, 0],[0, -1],[0, 1]]

  // 验证是否能走入这个格子
  // 1. 范围不能越界
  // 2. 本轮递归中未访问过
  // 3. 格子的值不能为 0
  let isValid = (y, x) => {
    return (y >= 0 && y < maxY) && 
    (x >= 0 && x < maxX) && 
    grid[y][x] !== 0 && 
    !visited[y][x]
  }

  let maxGold = 0
  let helper = (y, x, prevGold) => {
    let val = grid[y][x]
    let curGold = prevGold + val
    if (curGold === 0) {
      return
    }

    for (let dir of dirs) {
      let [diffY, diffX] = dir
      let nextY = y + diffY
      let nextX = x + diffX
      if (isValid(nextY, nextX)) {
        visited[y][x] = true
        helper(nextY, nextX, curGold)
        visited[y][x] = false
      } else {
        // 走到尽头或者不符合条件的了
        maxGold = Math.max(maxGold, curGold)
      }
    }
  }

  for (let y = 0; y < maxY; y++) {
    for (let x = 0; x < maxX; x++) {
      helper(y, x, 0)
    }
  }

  return maxGold
}

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      pFad - Phonifier reborn

      Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

      Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


      Alternative Proxies:

      Alternative Proxy

      pFad Proxy

      pFad v3 Proxy

      pFad v4 Proxy