【发布时间】:2015-01-26 22:21:50
【问题描述】:
我有一个我无法解决的问题。我有一个迷宫,我必须找到一条从 S 点到 E 点的路径,该路径的转弯最少。已知 E 点是可以到达的。我只能在 4 个方向上移动,左、右、上和下。它不必是最短路径,只要转弯最少。
我尝试将转数存储在优先队列中。例如,当我到达迷宫中的某个地方时,我将添加到那里的转数。从那里我会将他的邻居添加到优先队列中,如果他们还没有被访问过或者他们不是墙,我坐的当前块的值,例如 t + x 可以具有以下值(0-如果邻居面向我所面对的相同方向当我靠近他时,如果方向不同,则为 1)。似乎这种方法不适用于每种情况。
如果有人能给我一些提示,我将不胜感激。
【问题讨论】:
-
枚举所有路径,选择转弯最少的路径。优化记住迄今为止的最短解决方案,并在部分解决方案无法再导致更短路径时中止探索。
-
你了解广度优先搜索的概念吗?
-
更改迷宫中给定交叉点 A 的邻居列表,以包括从 A 直线可达的每个交叉点。 (“十字路口”包括迷宫的起点和终点。)现在找到最短路径。
-
@beaker 的方式非常好——它可以让您通过简单的 BFS 找到最佳答案,而不需要更复杂的 Dijkstra 或 A* 算法。 (A* 的一个很好的启发式可以使它比 BFS 更快,但似乎很难想出一个只关心转弯而不关心距离的算法。)记住忽略(位置,方向)状态 您已经访问过的对(像往常一样)。为提高效率,仅生成涉及转弯的子项作为第一步(因为同方向的移动已经生成为同级)。