Javascript 回溯递归在2D数组中查找从源到目标的路径

Javascript 回溯递归在2D数组中查找从源到目标的路径,javascript,angularjs,arrays,recursion,multidimensional-array,Javascript,Angularjs,Arrays,Recursion,Multidimensional Array,我试图在2D数组中找到一条可能的路径,我有一个源点(x,y)和一个目标点(destX,destY) 我试图用回溯递归的方式来做,因为我不在乎找到最短的路径,我只在乎找到一条路径 问题是,在算法中,它不知何故径直走到一个角落,然后卡在那里。。。所以我想我写了一些逻辑错误的东西 递归函数: $scope.findPath = function(x, y, destX, destY) { console.log("x: " + x + ", y: " + y); if(

我试图在2D数组中找到一条可能的路径,我有一个源点(x,y)和一个目标点(destX,destY)

我试图用回溯递归的方式来做,因为我不在乎找到最短的路径,我只在乎找到一条路径

问题是,在算法中,它不知何故径直走到一个角落,然后卡在那里。。。所以我想我写了一些逻辑错误的东西

递归函数:

$scope.findPath = function(x, y, destX, destY) {
        console.log("x: " + x + ", y: " + y);
        if(x >= $scope.buttons.length || x < 0 || y >= $scope.buttons[0].length || y < 0) {
            return false;
        }

        if(x == destX && y == destY) {
            return true;
        }

        if(!$scope.checkIfButtonEmpty(x, y)) {
            console.log("location not empty")
            return false;
        }

        $scope.solution[x][y].marked = true;

        if($scope.findPath(x + 1, y, destX, destY) === true) {
            return true;
        }
        if($scope.findPath(x, y + 1, destX, destY) === true) {
            return true;
        }
        if($scope.findPath(x - 1, y, destX, destY) === true) {
            return true;
        }
        if($scope.findPath(x, y - 1 , destX, destY) === true) {
            return true;
        }

        $scope.solution[x][y].marked = false;

        return false;
    };

请帮助我找出算法中的错误。

问题是您将在循环中运行,访问您以前尝试过的节点(未成功),然后重试

搜索不应该访问同一个广场两次。所以,请记住你以前去过的地方,这样你在回溯时就不会抹去那些痕迹,永远不要再从那个正方形开始搜索

这可以通过在解决方案节点中添加一个附加属性来实现,并在用
marked=true
标记节点之前添加这两行代码:

    if ($scope.solution[x][y].visited) return false;
    $scope.solution[x][y].visited = true;

有没有可能
$scope.startLocation[0]
$scope.startLocation[1]
是字符串而不是数字?@RickHitchcock没有。我确信问题一般不是来自语法/类型问题,除了$scope.startLocation是我在这里没有展示的代码中定义的数组。问题是代码确实在运行,递归运行了几个调用,直到它进入一个角落并被困在里面,所以这一定是我在编写递归函数时犯的一个逻辑错误。非常感谢这个简单的解决方案!我以前试过,但我想我写这些行的顺序和地点使它无法工作。现在,如果我想找到最短路径,有没有办法重构我已经编写的代码,或者我必须使用Bellman ford、Dijkstra等算法编写一个全新的解决方案?如果你想找到最短路径,DFS不是最有效的。在极端情况下,目标仅一步之遥,DFS搜索可能会在意识到它就在那里之前访问整个网格。所以,是的,你会寻找基于BFS的算法。例如,你可以看看
    if ($scope.solution[x][y].visited) return false;
    $scope.solution[x][y].visited = true;