algorithm – 在六边形网格中查找n长度的所有可能路径

假设函数将s(原点六边形),f(目标六边形)和n(路径长度)值作为参数,并输出具有n个长度的所有可能路径的列表.要查看问题,请查看下图:

《algorithm – 在六边形网格中查找n长度的所有可能路径》

假设我们的原点是红色虚线的十六进制(2,3),目标(f)是蓝色虚线的一个(5,2).我们希望以5个步骤(n = 5)到达蓝色虚线十六进制.还要考虑如果步行到达特定的十六进制,它也可能在下一步中保留在该十六进制中.换句话说,可能的路径之一可以是(3,2) – (4,2) – (5,2) – (5,2) – (5,2).它也算作5长度路径.

这些是从(2,3)到(5,2)的一些示例路径:

(1, 3) - (2, 3) - (3, 2) - (4, 3) - (5, 2)
(3, 3) - (4, 4) - (5, 4) - (5, 3) - (5, 2)
(2, 3) - (2, 3) - (3, 3) - (4, 3) - (5, 2)

我想以某种方式找到所有这些路径.但是,我无法确定哪种算法能够提供最有效的解决方案来解决此问题.首先想到的是使用深度优先搜索,但我想知道在这种情况下是否有更好的替代方法.

最佳答案 假设您定义了以下递归函数,返回对列表的列表,其中每个对列表是从from到to的路径,长度为i:

find_paths_from_to_with_length(from, to, i):
    if i == 1:
        if to in neighbors(from) or from == to:
            return [[(from, to)]]
        return []

    all_paths = []
    for node in neighbors(from) + [from]:
        neighbor_all_paths = find_paths_from_to_with_length(node, to, i - 1)
        for path in neigbor_all_paths:
            all_paths.append([(from, node)] + neighbor_path

    return all_paths

然后你只需要用它的源,目标和所需长度来调用它.

点赞