Задача 81: https://projecteuler.net/problem=81 tldr: Найдите минимальную сумму путей от верхнего левого угла до нижнего правого, перемещаясь только вправо и вниз в matrix.txt, текстовом файле, содержащем матрицу 80 на 80 .
Это похоже на задачу о кратчайшем пути во взвешенном графе acycli c, и я применил к ней алгоритм Дейкстры. Я получаю правильный ответ на несколько тестовых примеров, которые я пробовал, и я получаю неправильный ответ на проблему. форматирование кода, поэтому я просто помещу их сюда.
Комментарии:
ar содержит массив, а sp - памятка, содержащая все кратчайшие пути u [0] - это число, а u [1] = i и u [2] = j Q - очередь с приоритетом, каждый элемент имеет (value, pos x, pos y) sp - это dict, который хранит кратчайшие пути к (value, pos x, pos y) S store (value, pos x, pos y) элементов, кратчайшие пути к которым мы уже знаем
Мой код:
import numpy as np
def readfile(filename):
file = open(filename,"r")
ar=np.zeros((80,80))
sp={}
for i in range(80):
l=file.readline()
line=l.split(',')
for j in range(80):
ar[i][j]=int(line[j])
sp[(int(line[j]),i,j)]=10000000
return ar,sp
def extract_min():
min_n,i,j=100000,-1,-1
for n in Q:
if n[0]<min_n:
min_n=n[0]
i=n[1]
j=n[2]
return min_n,i,j
def adj(u):
try: a,i,j=(ar[u[1]][u[2]+1],u[1],u[2]+1)
except:a,i,j=-1,-1,-1
try: b,k,m=(ar[u[1]+1][u[2]],u[1]+1,u[2])
except:b,k,m=-1,-1,-1
return ((a,i,j),(b,k,m))
def relax(u,v):
if sp[v]>sp[u]+v[0]:
sp[v]=sp[u]+v[0]
parent[v]=u
def dijkstra():
Q.append(source)
S=[]
while len(Q)!=0:
u=extract_min()
Q.remove(u)
S.append(u)
for v in adj(u):
if v not in Q and v not in S and v[0]!=-1:
relax(u,v)
Q.append(v)
ar,sp=readfile("p081_matrix.txt")
source=(ar[0][0],0,0)
dest=(ar[79][79],79,79)
sp[source]=source[0]
Q=[]
parent={}
dijkstra()
print(sp[dest])