【发布时间】:2015-03-03 19:17:32
【问题描述】:
我正在尝试用 C++ 创建一个简单的基于网格的游戏。寻路是其中必要的一部分。我一直在寻找,但没有我想要的东西。
规则很简单。有一张地图。大小通常不超过 100 x 100 瓷砖。 1是地砖,0是墙。不允许对角线移动,因此每个网格只有 4 个方向。然而,目标大多不止一个。我想找到最近的路。请记住,我们不能只计算,哪个是最近的距离公式。由于墙壁,距离较短的目标可以走得更远。我认为使用一种已知算法并针对每个目标重复并不是一个好主意,因为它会变慢。
你有什么看法?我该怎么办?
【问题讨论】:
-
A* 在 4 连接空间中的 100 x 100 网格上将非常快(记得使用曼哈顿距离!)。您最好的选择实际上是简单地在所有这些上运行它并比较最终路径长度,因为如果不知道到达该目标的最佳路径,就无法根据您的定义确定哪个目标“最接近”。如果您的地图是静态的,您可以通过将其重新编码为图来进一步提高效率,其中顶点是连接的单元格(想想走廊),节点是路径中的分支,因此您需要遍历的状态更少。
-
如果你多次使用同一张地图进行寻路,我会考虑预先计算每个字段到其他字段的距离(当然不包括墙壁)
-
@tobi303:这是非常昂贵的 O(N*N) 并且通常不需要。取100x100的地图;你需要 O(100x100x100x100) 距离。对于可能合理的图表(并且这个网格将是),拥有数量少得多的常见“快捷方式”就足够了。例如。如果您可以识别死胡同,您只需要从死胡同中的每个点到颈部点的距离。
-
@MSalters 如果您使用同一张地图并进行许多寻路,那么如果您预先计算所有距离,则单次寻路的成本实际上是 O(1)。您只需在列表中查找即可。这种预先计算可以在“运行前”完成,所以我不明白你为什么称它为“非常昂贵”。特别是,您提到的技巧也可以在预先计算距离时应用。
-
@MSalters 另外,我猜,非墙砖的数量远低于 100x100。如果它只是 100x100,就不需要复杂的算法。当然,如果游戏每次使用不同的地图,预先计算就没有意义,但它确实会“非常昂贵”。
标签: c++ path-finding