Javascript 回溯递归在2D数组中查找从源到目标的路径
我试图在2D数组中找到一条可能的路径,我有一个源点(x,y)和一个目标点(destX,destY) 我试图用回溯递归的方式来做,因为我不在乎找到最短的路径,我只在乎找到一条路径 问题是,在算法中,它不知何故径直走到一个角落,然后卡在那里。。。所以我想我写了一些逻辑错误的东西 递归函数: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(
$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;