算法问题:唯一路径III在javascript中使用回溯模式无法正常工作

问题描述

在二维网格上,有4种正方形:

1代表开始的平方。恰好有一个起始方块。

2表示结束方块。恰好有一个结尾正方形。

0代表我们可以走过去的空方格。

-1表示我们无法越过的障碍。

将从开始方块到结束方块的4向步行次数返回,该步行精确遍历每个非障碍方块一次。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/unique-paths-iii

我正在尝试使用回溯模式来解决此问题

这是我的代码

/**
 * @param {number[][]} grid
 * @return {number}
 */
var uniquePathsIII = function(grid) {
    let m = grid.length,n = grid[0].length;
    let start,targetIndex1,targetIndex2;
    let res = 0;
    let zero_counts = 0;
    
    for(let i = 0; i < m; i++){
        for(let j = 0; j < n; j++){
            if(grid[i][j] == 1){
                start = [i,j]
            }
            else if(grid[i][j] == 0){
                zero_counts += 1;
            }
            else if(grid[i][j] == 2){
                targetIndex1 = i;
                targetIndex2 = j;
            }
        }
    }

    const backtrace = (i,j,zero_count) => {
        if( i < 0 || i >= m || 
            j < 0 || j >= n || 
            grid[i][j] == -1 || zero_count < 0)
        {
            return;
        }

        if(i == targetIndex1 && j == targetIndex2 ){
            if(zero_count == 0)
            {
                console.log("yes")
                res += 1;
            }
            return
        }
        
        grid[i][j] = -1;
        backtrace(i+1,zero_count - 1)
        backtrace(i-1,zero_count - 1)
        backtrace(i,j+1,j-1,zero_count - 1)

        grid[i][j] = 0;
    }

    backtrace(start[0],start[1],zero_counts);

    return res;
};

测试样本:

[[1,0],[0,2,-1]]

预期结果: 2

最终结果: 0

解决方法

也许更简单的解决方案是使用Depth First Search to solve Unique Paths III,如下所示。

概念是先抓住一个点,然后再四处走动,直到碰到障碍物为止。

胆量如下:

int totalPaths = dfs(grid,x+1,y,zero) +
                 dfs(grid,x,y+1,x-1,y-1,zero);