summaryrefslogtreecommitdiff
path: root/082.py
blob: b0fd92a85ff5fd219b5dec69b5846f0b2da28112 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85

# uses Dijkstra's algorithm to find minimal path
# (based on solution for problem 81)
#
# slow, but working

infinity = 99999999

matrix = []

width = 80
height = 80

f = open('082.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()

globalmin = 500000

for currentrow in range(height):

	# initialize
	distance = [infinity] * (width*height)
	pre = [None] * (width*height)
	distance[currentrow*width] = 0  # start node
	Q = range(width*height)

	def mindistance(Q):
		mini = Q[0]
		mind = distance[mini]
		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 == 0:
			return[u+1]
		if col < width-1:
			n.append(row*width + col + 1) # right neighbor
		if row < height-1:
			n.append((row+1)*width + col) # lower neighbor
		if row > 0:
			n.append((row-1)*width + col) # upper 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
	for targetrow in range(height):
		u = targetrow*width-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]

		if minsum < globalmin:
			globalmin = minsum

print globalmin