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

时间:2017-11-03 20:21:19

标签: 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(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;
    };

调用递归的函数,在找到路径并将其写入布尔2D数组后,应该以图形方式打印路径:

$scope.startDrawingConnection = function() {
        if($scope.startLocation.length == 2 && $scope.endLocation.length == 2){
            $scope.findPath($scope.startLocation[0], $scope.startLocation[1], $scope.endLocation[0], $scope.endLocation[1]);
            console.log("Finished finding path");
            $scope.drawPath();
            console.log("Finished drawing path");
        }
    };

请帮我弄清楚我在算法中做错了什么。

1 个答案:

答案 0 :(得分:1)

问题在于,您将在圈子中运行,访问您之前尝试过的节点(没有成功),然后再次尝试。

搜索不应该两次访问同一个广场。因此,请追踪您之前的位置,以便在回溯时不会消除该痕迹,并且再也不会再从该广场开始搜索。

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

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