给定宽度为W且高度为H且包含5种符号的网格:
'S' means starting position
'E' means ending position
'C' means checkpoints
'.' means open position and player can pass through it
'#' means closed block that player cant pass through.
玩家的目标是从最小距离开始到达终点,但他需要通过网格中的所有检查点。
我们需要找到这个最小距离。
允许玩家进行的一些动作是:
示例:
允许W=5
和H=5
# # # # #
# . C C #
# S # # #
# . . E #
# # # # #
然后这里的回答是9,路径是:
(1,2)=>(1,1)=>(2,1)=>(3,1)=>(2,1)=>(1,1,)= >(1,2)=>(1,3)=>(2,3)=>(3,3)
现在W
和H
可以达到100,最多检查点可以达到最多18
其中一种基本方法可以是在这里使用所有对最短路径。但由于它们可以是10000个节点,因此使用像Floyd-Warshall或Dijkstra这样的算法的O(N^3)
的复杂性将无法达到目的。 / p>
对于这个问题,他们是更好的方法吗?
答案 0 :(得分:1)
在检查点之间寻找路径的成本是您最不关心的问题。假设您只是从每个检查点(以及开始和结束节点)执行BFS,那么N
是检查点的数量,这将增长到O(N*W*H)
。但是,一旦你完成了这个简单的部分,你仍然需要决定检查点的订购。正如其他评论者指出的那样,这是旅行商问题,而你不会让它变得有效 - 这是不可避免的O(N!)
。为了比较,如果我们丢弃常数因子并使用W=H=100, N=18
,则最短路径的成本是180000“时间单位”......并且找到检查点的最佳排序的成本是6402373705728000“时间单位”。你可能已经注意到,这是一个更大的数字。
答案 1 :(得分:1)
使用A*之类的寻路算法查找两点之间的路径,然后您必须将问题分解为以下内容: -
cost(S,E) = cost(S,C1)+cost(C2,C3)..cost(C3,C4)..cost(Ck,E)
有k!
个k
个检查点序列,因此您的算法将为O(k!*N^2)
,并且由于此问题减少为 TSP ,因此无法获得更好的算法。
答案 2 :(得分:0)
我过去遇到过同样的问题。我会告诉你我做的方式。
首先,我使用Dijkstra来找出从S到C1的距离.... Ck
然后再次距离C1 ...... Ck 然后从C2 ... Ck等等。
这将为您提供从每个检查点到所有其他检查点的最短路径,包括开始和结束。
现在在每个检查点之间创建一个邻接矩阵,包括开始和目标。
最后使用旅行推销员找出通过检查站的最短路线。
如果你不知道如何实现TSP,那么跳过最后两步,即来自Adjacency矩阵和 使用Bruteforce找出最短路径(需要更多时间,但最终完成工作)。
我希望它有所帮助