当前位置: 首页 > 知识库问答 >
问题:

算法问题:独特的路径三。在javascript中使用回溯模式并且不起作用

常英毅
2023-03-14

在二维上

1表示起始正方形。

2代表结束方块。

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

-1代表我们无法跨越的障碍。

返回四向行走的次数

来源:力扣(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, j, zero_count - 1)
        backtrace(i-1, j, zero_count - 1)
        backtrace(i, j+1, zero_count - 1)
        backtrace(i, j-1, zero_count - 1)

        grid[i][j] = 0;
    }

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

    return res;
};

测试样本:

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

预期结果:2

结果: 0

共有1个答案

雷浩思
2023-03-14

或许更简单的解决方案是使用深度优先搜索来解决唯一路径III,如此处所示。

这个概念是,你取一个点,然后向各个方向移动,直到你遇到一个障碍物。

内脏如下:

int totalPaths = dfs(grid, x+1, y,   zero) +
                 dfs(grid, x,   y+1, zero) +
                 dfs(grid, x-1, y,   zero) +
                 dfs(grid, x,   y-1, zero);
 类似资料:
  • 最近,我发现了回溯,没有太多思考就从一个展示了一些数独回溯技巧的家伙那里开始了这本书(https://www.youtube.com/watch?v=G_UYXzGuqvM 这个问题被相应地表述为:使用回溯计算x*y网格中从左下角到右上角的所有路径的数量。这包括以下路径:https://imgur.com/3t3Np4M.请注意,每个点只能访问一次。编写一个函数np(x,y),返回x*y网格中的路

  • 我已经创建了一个数独解算器,它可以像人类一样解数独,通过检查与被检查方格对应的方格中的可能性确定值。 (来源:http://pastebin.com/KVrXUDBF) 但是,我想创建一个随机数独生成器(从空白网格),因此决定使用回溯算法。我理解回溯的概念,但对一件事感到困惑: 一旦我知道某个解决方案是不允许的,我如何知道要返回(和更改)哪个前一个节点?我应该简单地返回到前一个节点并循环浏览所有可

  • 我正在尝试实现DFS回溯算法,该算法涉及利用维基百科上的堆栈(而不是递归算法)。我试图生成一个由0和1组成的迷宫,其中1代表一堵墙,0代表一条可用路径。对于迷宫中不是墙的任何给定空间,必须始终有一条有效的路径,可以从任何其他非墙单元格到达。 我从一个迷宫开始,它是一个二维大小的迷宫阵列[15][20],然后按照算法将需要标记为已正确访问的单元格标记为已访问。最初,所有单元格(不包括外部边框)都标记

  • 我想用谷歌搜索一下,通过回溯来解决迷宫问题!我看到了这个算法:递归:解迷宫 这是: 查找路径(x,y) > 如果(x,y在迷宫外)返回false 如果(x,y是目标)返回true 如果(x,y未打开)返回false 将x、y标记为解决方案路径的一部分 if(FIND-PATH(x,y以北)=true)返回true if(FIND-PATH(x,y以东)=true)返回true 如果(FIND-PA

  • 一个位于XxX网格左上角的机器人正试图到达右下角。机器人可以向上、向下、向左或向右移动,但不能访问同一地点两次。右下角有多少条可能的唯一路径? 对此,快速算法解决方案是什么?我花了大量的时间试图找出一个快速算法来解决这个问题。但还是卡住了。 除了回溯之外,使用动态规划来处理唯一路径的快速算法解决方案是什么?可以快速找到10x10网格的结果1,568,758,030,464,750,013,214,

  • 我正在解决一些关于LeetCode的问题。其中一个问题是: 给定一个由非负数填充的mxn网格,找到一条从左上到右下的路径,该路径使沿其路径的所有数字之和最小化。你只能在任何时间点向下或向右移动。 社论以及发布的解决方案都使用动态规划。投票最多的解决方案之一如下: 我的问题很简单:这不应该用回溯法解决吗?假设输入矩阵如下所示: [1,2500] [100500500] [1,3,4] ] 我的怀疑是