LeetCode 算法:迷路的机器人

103 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第 16 天,点击查看活动详情

迷路的机器人

原题地址

设想有个机器人坐在一个网格的左上角,网格 rc 列。机器人只能向下或向右移动,但不能走到一些被禁止的网格(有障碍物)。设计一种算法,寻找机器人从左上角移动到右下角的路径。

网格中的障碍物和空位置分别用 10 来表示。

返回一条可行的路径,路径由经过的网格的行号和列号组成。左上角为 00 列。如果没有可行的路径,返回空数组。

示例 1:

输入:
[
  [0,0,0],
  [0,1,0],
  [0,0,0]
]
输出: [[0,0],[0,1],[0,2],[1,2],[2,2]]
解释: 
输入中标粗的位置即为输出表示的路径,即
00列(左上角) -> 01列 -> 02列 -> 12列 -> 22列(右下角)

说明:

  • r 和 c 的值均不超过 100

思路分析

  1. 使用深度遍历的算法可以得到结果;
  2. 定义一个 flag 来标记是否找到目的地,定义一个 dfs 的方法来遍历看是否可以找到可以移动的位置;
  3. dfs 方法中,首先要做边界判断,下标越界或者当前位置存在障碍物时,不需要处理;
  4. 将当前值存入 res 中,然后做标记证明处理过。若到达终点,则 flag = true;
  5. 若没有到达终点,则继续向下或者向右走,若向下或向右走没到达目的地,则说明改点无效即需要移除;
  6. 最后返回能得达到重点的 res 结果即可。

AC 代码

/**
 * @param {number[][]} obstacleGrid
 * @return {number[][]}
 */
var pathWithObstacles = function(obstacleGrid) {
    const m = obstacleGrid.length
    const n = obstacleGrid[0].length
    const res = []
    let flag = false
    const dfs = (x, y, obstacleGrid) => {
        if(x < 0 || x >= m || y < 0 || y >= n || obstacleGrid[x][y] === 1) 
            return
        res.push([x, y])
        obstacleGrid[x][y] = 1
        if(x === m - 1 && y === n - 1) flag = true 
        if(!flag) dfs(x + 1, y, obstacleGrid)
        if(!flag) dfs(x, y + 1, obstacleGrid)
        if(!flag) res.pop()
    }
    dfs(0, 0, obstacleGrid)
    return res
};

结果:

  • 执行结果: 通过
  • 执行用时:68 ms, 在所有 JavaScript 提交中击败了60.78%的用户
  • 内存消耗:43.5 MB, 在所有 JavaScript 提交中击败了47.06%的用户
  • 通过测试用例:46 / 46

END