【发布时间】:2020-05-11 15:38:32
【问题描述】:
我是一个相当初学者/新手 JavaScript 编码器,没有太多 CS/数学经验,尝试编写基于 Web 的游戏的一部分以检查所有可能路径的“最长路径”,例如卡坦岛最长的道路得分。
我尝试使用堆栈的迭代深度优先搜索的可能错误实现来做到这一点。它应该走每条可能的路径,然后当它遇到死胡同时,检查当前路径是否比之前最长的路径长,如果是则覆盖。
不过,我的代码不太好用;当遇到十字路口或其他变化时,它似乎并没有真正步行/检查所有可能的路径。
我对 DFS 和这些类型的算法进行了各种研究,并且在试图理解它时遇到了非常艰难的时间;这是我最接近可行的方法。我确信代码可以通过递归或类似的方式变得更优雅,但在这一点上,我只想了解为什么我在这里写的东西不起作用。
相关代码如下。我敢肯定这在许多不同的方面都是一团糟,但希望至少函数名称等足够清楚,这样就有足够的上下文来弄清楚最终出了什么问题:
function walkAllPaths(node, network, t) {
var stack = [ node ];
var path = new Array();
var visited = new Array();
while (stack.length) {
var curr = stack.pop();
visited.push(curr);
var moveNorth = myNeighbor(curr, "north");
var moveSouth = myNeighbor(curr, "south");
var moveWest = myNeighbor(curr, "west");
var moveEast = myNeighbor(curr, "east");
if (isValidMove(network, visited, t, moveNorth)) { stack.push(moveNorth); }
else if (isValidMove(network, visited, t, moveWest)) { stack.push(moveWest); }
else if (isValidMove(network, visited, t, moveSouth)) { stack.push(moveSouth); }
else if (isValidMove(network, visited, t, moveEast)) { stack.push(moveEast); }
else {
if (visited.length > path.length) {
path.length = 0;
for (var i = 0; i < visited.length; i++) {
path.push(visited[i]);
}
}
visited.pop();
}
console.log(visited);
}
return path;
}
【问题讨论】:
-
您是否尝试过为经过的路径着色?这可以帮助您缩小发生问题的范围。
-
@EhsanMahmud - 我一直在其中使用 console.log 命令来查看函数迭代时形成的所有路径。它完美地捕捉了一些路线,但随后似乎忽略甚至从不检查其他路线。它在线性路线上是完美的,但不能正确地跑回路口/交叉路口。
-
你能举一个输入输出的例子吗?会更容易调试。
-
您编写迭代 DFS 而不是递归执行它更容易实现的任何特定原因?
标签: javascript stack iteration depth-first-search maze