在网格(nxn)中,如何从一个点到另一个点找到k,k + 1,k + 2路径?

时间:2011-04-20 02:31:52

标签: java algorithm

考虑网格(n = 3的矩阵):

0 1 2
3 4 5
6 7 8

我需要找到任意点到任意点(此处为3到2)之间的k+1k+2路径,其中k是最短距离或跳数({{ 1}})。如何查找dist k=3k=4的路径?

我有一个程序(在java中)用于查找所有k=5路径:

k

通过使用距离公式,我可以限制垂直和水平移动的数量,并使用递归来查找最短路径中的所有点。有人可以为dist> 3的路径建议类似的内容吗?

2 个答案:

答案 0 :(得分:0)

您可能会看到约翰逊算法part Ipart II,它会在有向图中枚举所有基本电路(周期)。

答案 1 :(得分:0)

忽略它是一个网格的事实。只需将其视为图表。你有分数。每个点都有邻居。每个点与最终点的距离最小。这是一些用于演示算法的Python。 (翻译成Java应该不难。)

def paths(p1, p2, length):
    answer = []
    if 0 == length and p1 == p2:
        answer = [p1]
    elif length <= distance(p1, p2):
        for p in neighbors(p1):
            answer.extend([ [p1] + x for x in paths(p, p2, length-1) ])
    return answer

作为重要的优化,您可能会注意到在您的情况下,从p1p2的所有路径都具有相同的长度mod 2.因此,对于长度k + i,根本没有路径,除非i是偶数。