携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第 16 天,点击查看活动详情
迷路的机器人
原题地址
设想有个机器人坐在一个网格的左上角,网格 r 行 c 列。机器人只能向下或向右移动,但不能走到一些被禁止的网格(有障碍物)。设计一种算法,寻找机器人从左上角移动到右下角的路径。
网格中的障碍物和空位置分别用 1 和 0 来表示。
返回一条可行的路径,路径由经过的网格的行号和列号组成。左上角为 0 行 0 列。如果没有可行的路径,返回空数组。
示例 1:
输入:
[
[0,0,0],
[0,1,0],
[0,0,0]
]
输出: [[0,0],[0,1],[0,2],[1,2],[2,2]]
解释:
输入中标粗的位置即为输出表示的路径,即
0行0列(左上角) -> 0行1列 -> 0行2列 -> 1行2列 -> 2行2列(右下角)
说明:
r和c的值均不超过100。
思路分析
- 使用深度遍历的算法可以得到结果;
- 定义一个 flag 来标记是否找到目的地,定义一个 dfs 的方法来遍历看是否可以找到可以移动的位置;
- dfs 方法中,首先要做边界判断,下标越界或者当前位置存在障碍物时,不需要处理;
- 将当前值存入 res 中,然后做标记证明处理过。若到达终点,则 flag = true;
- 若没有到达终点,则继续向下或者向右走,若向下或向右走没到达目的地,则说明改点无效即需要移除;
- 最后返回能得达到重点的 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