一尘不染

在六角形网格中找到所有长度为n的可能路径

algorithm

假设一个函数将s(原始六边形),f(目标六边形)和n(路径长度)值作为参数,并输出所有长度为n的可能路径的列表。

假设我们的原点(s)是红色的虚线十六进制(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)

我想以某种方式找到所有这些路径。但是,我无法确定哪种算法为解决此问题提供了最有效的解决方案。首先想到的是使用深度优先搜索,但是我想知道在这种情况下还有没有更好的选择。


阅读 225

收藏
2020-07-28

共1个答案

一尘不染

假设您定义了以下递归函数,返回一个成对列表的列表,其中每个成对列表都是从fromtolength 的路径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

然后,只需使用源,目标和所需的长度来调用它。

2020-07-28