980. 不同路径 III
leetcode-cn.com/problems/un…
- 哈密尔顿路径 dfs + 回溯
- 重点是记录还剩多少个未走的,每次dfs都将剩余未走的点减1
- 注意找到一个合适的路径后,要回溯把终点的visited设置为false
/**
* @param {number[][]} grid
* @return {number}
*/
var uniquePathsIII = function(grid) {
const row = grid.length
const col = grid[0].length
const visited = []
let start,end
let left = row * col
let counter = 0
const dirs = [[0,1],[1,0],[0,-1],[-1,0]]
for(let i=0
visited[i] = []
for(let j=0
visited[i][j] = false
if(grid[i][j]===1){
grid[i][j] = 0
start = i*col + j
}else if(grid[i][j]===2){
grid[i][j] = 0
end = i*col + j
}else if(grid[i][j]===-1){
left --
}
}
}
const inArea = (x,y)=>{
return x<row && x>=0 && y<col && y>=0
}
const dfs = (curr,left)=>{
const x = Math.floor(curr/col)
const y = curr % col
left--
visited[x][y] = true
if(curr === end && left ===0){
visited[x][y] = false // 回溯
counter ++
return
}
for(let i=0
const nowX = x + dirs[i][0]
const nowY = y + dirs[i][1]
if(inArea(nowX,nowY) && !visited[nowX][nowY] && grid[nowX][nowY] === 0){
dfs(nowX*col + nowY , left)
}
}
visited[x][y] = false //回溯
}
dfs(start,left)
return counter
}