Euler项目#18-如何使用Python在树状结构中强制执行所有可能的路径?

Euler项目#18-如何使用Python在树状结构中强制执行所有可能的路径?,python,Python,我试图在大西洋上学习Python,但我仍坚持着Euler#18项目 我在上面提到的所有东西(除此之外还有更多的谷歌搜索)都是“你可以用蛮力来对付它,但这里有一个更优雅的解决方案” 我明白,我完全明白。这里有非常好的解决方案,我期待着有一天,这个短语在我的脑海中会产生比模糊的、一百万像素的分辨率更多的东西。但在我跑到这里之前我需要先走路,然后玩弄蛮力的回答 那么,问题是:如何生成(枚举?)中三角形的所有有效路径,并将它们存储在适当的python数据结构中?(列表是我最初的爱好?)。我不想要答案——

我试图在大西洋上学习Python,但我仍坚持着Euler#18项目

我在上面提到的所有东西(除此之外还有更多的谷歌搜索)都是“你可以用蛮力来对付它,但这里有一个更优雅的解决方案”

我明白,我完全明白。这里有非常好的解决方案,我期待着有一天,这个短语在我的脑海中会产生比模糊的、一百万像素的分辨率更多的东西。但在我跑到这里之前我需要先走路,然后玩弄蛮力的回答

那么,问题是:如何生成(枚举?)中三角形的所有有效路径,并将它们存储在适当的python数据结构中?(列表是我最初的爱好?)。我不想要答案——我想知道如何强制所有路径并将它们存储到数据结构中

这是我得到的。我肯定是把数据集循环错了。期望的行为是“深度优先(?)”,而不是无效地在每一行上循环。。我读了诺维格书的第三章,但无法翻译psuedo代码。尝试阅读第三章的AIMA python,但它有太多的飞跃

triangle = [
    [75],
    [95, 64],
    [17, 47, 82],
    [18, 35, 87, 10],
    [20,  4, 82, 47, 65],
    [19,  1, 23, 75,  3, 34],
    [88,  2, 77, 73,  7, 63, 67],
    [99, 65,  4, 28,  6, 16, 70, 92],
    [41, 41, 26, 56, 83, 40, 80, 70, 33],
    [41, 48, 72, 33, 47, 32, 37, 16, 94, 29],
    [53, 71, 44, 65, 25, 43, 91, 52, 97, 51, 14],
    [70, 11, 33, 28, 77, 73, 17, 78, 39, 68, 17, 57],
    [91, 71, 52, 38, 17, 14, 91, 43, 58, 50, 27, 29, 48],
    [63, 66,  4, 68, 89, 53, 67, 30, 73, 16, 69, 87, 40, 31],
    [04, 62, 98, 27, 23,  9, 70, 98, 73, 93, 38, 53, 60,  4, 23],
]


def expand_node(r, c):
    return [[r+1,c+0],[r+1,c+1]]

all_paths = []
my_path = []

for i in xrange(0, len(triangle)):
    for j in xrange(0, len(triangle[i])):
        print 'row ', i, ' and col ', j, ' value is ', triangle[i][j]
        ??my_path = somehow chain these together???
        if my_path not in all_paths
            all_paths.append(my_path)

首选避免使用外部库(如itertools)的答案。

这里使用递归更容易:

def all_paths(r, c):
    current = triangle[r][c]
    if r < len(triangle) - 1:
        below_paths = all_paths(r+1, c) + all_paths(r+1, c+1)
        return [[current] + path for path in below_paths]
    else:
        return [[current]]
def所有路径(r,c):
电流=三角形[r][c]
如果r
这里的想法是
all_paths(r,c)
返回从行
r
、列
c
开始的所有路径,这通常是通过递归地从它下面的两个节点获取所有路径,并将当前元素预先分配给所有节点来获得的

如果我们在最后一行,我们只返回由单个元素组成的路径

要获取从顶部开始的所有路径,请调用
所有路径(0,0)


然后可以很容易地修改此函数,以返回每条路径的和,而不是路径本身,并且进一步修改后,它只能返回最大的和,而不是所有路径。解决这个问题的“正确方法”本质上只是一个记忆版本。

问题是暴力路径的数量是15!或1307674368000。你的电脑内存有多少?@MarkTolonen:问题信息显示只有16384条线路。不管怎样,是什么让你认为一个有效的解决方案必须记住所有的路径?@matineau,OP问“如何强制所有路径并将它们存储到数据结构中”。他还可以用itertools一次生成一个,那么他有多少时间?另外,我还解决了“快”的问题。不是15不需要不经过所有行的中间路径。根据这个问题,如果你使用暴力,它是16384个解决方案。阿克,对不起,我在考虑行的排列。它是2^14或16384。