查找tile网格中两个点之间的所有长度为n的路径

时间:2015-07-30 23:20:20

标签: algorithm path-finding

我有一个基于2D图块的地图,其中两个点彼此相邻。我想找到这两个点之间所有长度为n的路径(这些点总是相邻的,n的值总是至少为3,因此这些路径永远不会是最短的路径),可以排除任何通过的路径通过一个或多个任意定义的点。

我已经研究了许多寻路算法,但是我很难想出一种方法来修改它们以返回具有精确长度的所有路径。有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:1)

查找所有路径都很不寻常,因此寻路算法可能对您没有帮助。你真的在寻找一个缓慢的详尽搜索。

我首先使用Dijkstra算法在n个步骤中找到终端节点和每个节点之间的最短路径。这将在以后有用,因为它找到每个节点的最短路径。之后,我们可以用它来修剪无用的路径。

然后我会开始迭代搜索网格。在每一步,跟踪到达那里的路径,调用长度m。请记住,您将有许多路径(可能是循环路径)到达同一节点。你想要保留所有这些。在每次迭代中,查看当前节点的邻居,并将新路径推送到搜索中,该路径将以n-m步进到每个邻居,这些邻居可以到达端点。

最终,您可能会耗尽可能到达端点的节点,您只需查看到达端点的所有路径。

答案 1 :(得分:0)

只需进行详尽的搜索。你可以修剪一些永远不会到达目的地的分支:

search(from, to, n):
    if from is outside boundaries: return
    if distance(from, to) > n: return
    if n == 0:
        if from == to:
            do something with your path
        return
    search(left of from,  to, n-1)
    search(right of from, to, n-1)
    search(up of from,    to, n-1)
    search(down  of from, to, n-1)

如果您的路径不需要重复点,只需按照通常使用DFS的方式进行跟踪,但请记住在退出节点时取消标记为已访问(因此您可以在另一个路径中再次访问它)。