这是我参与第四届青训营笔记创作活动的第25天
(本文在此声明,此文为本作者另一个账号所写,参与青训营后发现发现青训营手机号填的不是那个,特此将笔记转载过来)
在二维网格 grid 上,有 4 种类型的方格:
1 表示起始方格。且只有一个起始方格。
2 表示结束方格,且只有一个结束方格。
0 表示我们可以走过的空方格。
-1 表示我们无法跨越的障碍。 返回在四个方向(上、下、左、右)上行走时,从起始方格到结束方格的不同路径的数目。
每一个无障碍方格都要通过一次,但是一条路径中不能重复通过同一个方格。
来源:力扣(LeetCode) 链接:leetcode.cn/problems/un…
示例1:
输入: [[1,0,0,0],[0,0,0,0],[0,0,2,-1]]
输出: 2
题目的简单意思:从1开始,到2结束,经过所有的0,所有的-1不经过,所有路径只能经过一次。 解题思路:回溯
1.首先找到起点的位置,获取需要移动的步数。 2.从起点开始,每一步走过之后,设值为-1,分别递归,向左、向右、向上、向下的情况
var uniquePathsIII = function (grid) {
let res = 0
let l = grid.length
let r = grid[0].length
// 计算0的个数count,获取起点位置grid[m,n]
let count = 0
let m, n
for (let i = 0; i < grid.length; i++) {
for (let j = 0; j < grid[i].length; j++) {
if (grid[i][j] == 0) {
count++
}
if (grid[i][j] == 1) {
m = i
n = j
}
}
}
function dfs(m, n, index) {
//递归终止条件判断。当m,n超出矩形边界时,当前矩形位置为-1时,当前值为-2但是步数没有达到要求时,均终止递归
if (m >= l || n >= r || m < 0 || n < 0 || grid[m][n] == -1) {
return
} else
if (grid[m][n] == 2) {
//当前位置值为-2,并且步数达到要求(等于0的个数+1的个数+2的个数)
if (index == count + 2) {
res++
return
} else {
return
}
}
//走过的路,设置值为-1,防止重复走
grid[m][n] = -1
//递归
dfs(m, n + 1, index + 1)
dfs(m + 1, n, index + 1)
dfs(m - 1, n, index + 1)
dfs(m, n - 1, index + 1)
//回溯,将状态设置为递归前状态
grid[m][n] = 0
}
dfs(m, n, 1)
return res
};