[LeetCode 980 不同路径 III] | 刷题打卡

115 阅读1分钟

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;i<row;i++){
        visited[i] = []
        for(let j=0;j<col;j++){
            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;i<dirs.length;i++){
            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
    
};