【问题标题】:Maze least turns迷宫最少转弯
【发布时间】:2015-01-26 22:21:50
【问题描述】:

我有一个我无法解决的问题。我有一个迷宫,我必须找到一条从 S 点到 E 点的路径,该路径的转弯最少。已知 E 点是可以到达的。我只能在 4 个方向上移动,左、右、上和下。它不必是最短路径,只要转弯最少。

我尝试将转数存储在优先队列中。例如,当我到达迷宫中的某个地方时,我将添加到那里的转数。从那里我会将他的邻居添加到优先队列中,如果他们还没有被访问过或者他们不是墙,我坐的当前块的值,例如 t + x 可以具有以下值(0-如果邻居面向我所面对的相同方向当我靠近他时,如果方向不同,则为 1)。似乎这种方法不适用于每种情况。

如果有人能给我一些提示,我将不胜感激。

【问题讨论】:

  • 枚举所有路径,选择转弯最少的路径。优化记住迄今为止的最短解决方案,并在部分解决方案无法再导致更短路径时中止探索。
  • 你了解广度优先搜索的概念吗?
  • 更改迷宫中给定交叉点 A 的邻居列表,以包括从 A 直线可达的每个交叉点。 (“十字路口”包括迷宫的起点和终点。)现在找到最短路径。
  • @beaker 的方式非常好——它可以让您通过简单的 BFS 找到最佳答案,而不需要更复杂的 Dijkstra 或 A* 算法。 (A* 的一个很好的启发式可以使它比 BFS 更快,但似乎很难想出一个只关心转弯而不关心距离的算法。)记住忽略(位置,方向)状态 您已经访问过的对(像往常一样)。为提高效率,生成涉及转弯的子项作为第一步(因为同方向的移动已经生成为同级)。

标签: c++ algorithm maze


【解决方案1】:

你在正确的轨道上。你需要为这个问题实现的是Dijkstra's algorithm。你只需要考虑不仅仅是点作为图的顶点,而是一对(point,direction)。从每个顶点(p,d) 你有 5 条边(尽管最后一条可以被墙挡住):(p,0)(p,1)(p,2)(p,3)(neighbour of p in direction d, d)。前四个边的权重为 1(当您在此处转动时),最后一个边的权重为 0(不转弯,向前移动)。算法足以忽略循环,并且对于权重为 0 的边工作正常。当从优先级队列中提取任何顶点 (end point, _) 时,您应该结束。

这种方法有一个问题,因为在这个过程中检查了太多的顶点。如果你的迷宫很小,那不是问题。否则,请考虑稍作修改,称为A*。您需要一个很好的启发式函数,描述目标转数的下限。

【讨论】:

  • 这基本上是对的,但我对 5 个边缘感到困惑。由于移动只有 U、D、L 和 R,我认为每个位置最多有 4 个图顶点,每个对应于传入的方向,并且每个都可以被墙挡住。 (您可能希望起始位置有一个特殊的“无关”方向——在这种情况下,只有一个顶点对应于该位置。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-24
  • 1970-01-01
相关资源
最近更新 更多