# uses Dijkstra's algorithm to find minimal path infinity = 999999 matrix = [] width = 80 height = 80 f = open('081.txt', 'r') for line in f: line.rstrip('\n') line_str = line.split(',') line_int = [ int(x) for x in line_str ] matrix.append(line_int) f.close() # initialize distance = [infinity] * (width*height) pre = [None] * (width*height) distance[0] = 0 Q = range(width*height) def mindistance(Q): mind = infinity mini = -1 for i in Q: if distance[i] < mind: mind = distance[i] mini = i return mini def neighbors(u): n = [] row = u / width col = u % width if col < width-1: n.append(row*width + col + 1) # right neighbor if row < height-1: n.append((row+1)*width + col) # lower neighbor return n def update(u, v): alt = distance[u] + matrix[v/width][v%width] if alt < distance[v]: distance[v] = alt pre[v] = u # main algorithm while len(Q) > 0: u = mindistance(Q) Q.remove(u) for v in neighbors(u): if v in Q: update(u, v) # search min distance u = width*height-1 # target node path = [ u ] while pre[u] != None: u = pre[u] path = [u] + path minsum = 0 for n in path: minsum += matrix[n/width][n%width] print minsum