我试图在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");
}
};
请帮我弄清楚我在算法中做错了什么。
答案 0 :(得分:1)
问题在于,您将在圈子中运行,访问您之前尝试过的节点(没有成功),然后再次尝试。
搜索不应该两次访问同一个广场。因此,请追踪您之前的位置,以便在回溯时不会消除该痕迹,并且再也不会再从该广场开始搜索。
您可以通过在解决方案节点中添加其他属性来实现,并在使用marked = true
标记节点之前添加这两行代码:
if ($scope.solution[x][y].visited) return false;
$scope.solution[x][y].visited = true;