【问题标题】:Iterative depth-first search to find longest path in JavaScript?迭代深度优先搜索以找到 JavaScript 中的最长路径?
【发布时间】: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


【解决方案1】:

我实际上设法弄清楚发生了什么!我仍然相当肯定这根本不是一个最佳解决方案,但它现在完全按照它应该做的 - 走所有有效路径,然后返回一个包含它走过的最长路径的数组。这是最终代码:

function walkAllPaths(node, network, t) {
    var stack = [ node ];
    var path = [];
    var visited = [];
    var longPath = [];

    while (stack.length) {
        var curr = stack.pop();

        visited.push(curr);
        if (curr !== path[path.length - 1]) { path.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 (path.length > longPath.length) {
                longPath.length = 0;
                for (var i = 0; i < path.length; i++) {
                    longPath.push(path[i]);
                }
            }
            path.pop();
            if (path.length) { stack.push(path[path.length - 1]); }
        }
    }

    return longPath;
}

感谢那些提供想法/建议的人!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 2022-09-24
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    相关资源
    最近更新 更多