【问题标题】:Mouse in Maze - Stacks (but count steps also)迷宫中的鼠标 - 堆栈(但也计算步数)
【发布时间】:2021-08-28 07:32:33
【问题描述】:

我正在阅读 Adam Drozdek 关于 DSA 的书,在解决迷宫中的鼠标问题时,他正在使用堆栈。但是我将如何(如果我愿意)计算老鼠走的步数?因为根据他的堆栈解决方案,假阳性邻居(即未能到达目的地的邻居)也被标记,并且没有取消标记这些单元格的回溯。请帮助我。请。

编辑:他的算法

exitMaze ()
    while currentCell is not exitCell
        mark currentCell as visited;
        push unvisited neighbors of currentCell onto the stack
        if stack is empty
             failure;
        else pop off a cell from the stack and make it currentCell
    success;

这样,迷宫将被一条从老鼠的初始点到出口点的 X 路径填充。但它也会在经过尝试和失败的路径上充满“X”。那么如何计算路径中的步数呢?

【问题讨论】:

  • 如果不展示更多关于算法的细节以及你的算法实现,我认为没有人能够帮助你(除非他们最近碰巧读过同一本书,我认为)。请在您的问题中添加更多内容,并考虑一些随机在线人需要知道什么才能理解您的问题。
  • @BoBTFish 感谢您阅读和回复此内容。我刚刚编辑了它。也许它可以让我的问题更加清晰。
  • 在我看来,最简单的方法是将更多信息放入堆栈对象:下一个单元格到达那里的路径。然后,当您弹出该对象时,您的路径是先前的路径和新的单元格。当您弹出一个作为出口的位置时,您就有了完整的路径。如果您只需要计数,则可以存储它而不是路径,并在每次推送新单元格时添加一个。
  • BoBTFish' 建议添加距离是正确的,但请注意,此算法不一定找到最短路径。如果有多条不同长度的路径穿过迷宫,push unvisited neighbors of currentCell onto the stack 中未访问的邻居的顺序决定了你将离开这些长度中的哪一个。根据您的要求,这可能有意义,也可能没有意义。如果您想知道最短路径,则需要使用不同的算法。
  • 谢谢@BoBTFish,我刚刚意识到在解决迷宫之后,我可以在'X's的负载上重新应用相同的算法,因为正如你所说,它是一个“路径”,并且路径是 1直线。这意味着在路径的任何一点,它都不能分叉或三叉。如果是这样,那么我将子路径推送到路径堆栈并弹出它们直到我到达目的地。这样,我将获得一组标记路径的单元格。和 sizeof(array) 会给我“计数”或所需的步骤。

标签: c++ algorithm dynamic-programming


【解决方案1】:

对算法稍作更改,您将在堆栈中留下路径:

exitMaze ()
    push start cell on the stack
    while stack is not empty
        let currentCell = top cell on the stack
        mark currentCell as visited; //it might already be marked, but that's OK
        if currentCell is exitCell
            success. Path is on the stack;
        else if currentCell has an unvisited neighbor
            push an unvisited neighbor on the stack
        else
            pop a cell off the stack
    failure;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多