用Python编写Euler 81项目

时间:2012-06-27 08:17:14

标签: python

在下面的5乘5矩阵中,从左上角到右下角的最小路径总和,仅向右和向下移动,以粗体红色表示,等于2427.

131 673 234 103 18

201 96 342 965 150

630 803 746 422 111

537 699 497 121 956

805 732 524 37 331

在matrix.txt中找到最小路径总和(右键单击并将“保存链接/目标为...”),一个包含80 x 80矩阵的31K文本文件,仅从左上角到右下角向右和向下移动。

备注:当他们标记http://projecteuler.net/problem=81

的方式时,我认为他们确实犯了错误
import numpy as np

matrix0 = [ map(int, row.split()) for row in open('matrix.txt')]

matrix=np.arange(6400).reshape(80,80)

for i in range(80):
    for j in range(80):
        matrix[i, j]=0

for i in range(80):
    for j in range(80):
        matrix[i, j]=matrix0[i][j]

sum=matrix[0,0]

k=0
n=0
while (k+n)<158:
    for i in range(k, k+1):
        for j in range(n, n+1):
            if i!=79 and j!=79:
                if matrix[i+1, j]<=matrix[i, j+1]:
                    sum=sum+matrix[i+1, j]
                    k=i+1
                    n=j
                else:
                    sum+=matrix[i, j+1]
                    k=i
                    n=j+1
            elif i==79:
                sum+=matrix[i, j+1]
                k=i
                n=j+1
            elif j==79:
                sum+=matrix[i+1, j]
                k=i+1
                n=j                 

print sum

当我将此代码用于矩阵5x5时,就像问题一样,它给了我正确的答案。我无法理解为什么它不适用于更大的矩阵?

1 个答案:

答案 0 :(得分:5)

因为您没有正确执行搜索。问题是要求总体最低成本路径,因此您需要A *搜索或Dijkstra算法。对每个节点的最低分支进行简单的一次检查不会削减它。