【发布时间】: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