parent
be0f98f49c
commit
a04389e1dc
@ -0,0 +1,75 @@
|
||||
lines = open("input.txt", "r").read().splitlines()
|
||||
|
||||
relief = []
|
||||
starting_points = []
|
||||
points = []
|
||||
s = None
|
||||
e = None
|
||||
for i, line in enumerate(lines):
|
||||
els = []
|
||||
for j, letter in enumerate(line):
|
||||
if letter == "a":
|
||||
starting_points.append((i, j))
|
||||
if letter == "S":
|
||||
els.append(1)
|
||||
s = (i, j)
|
||||
starting_points.append((i, j))
|
||||
elif letter == "E":
|
||||
els.append(26)
|
||||
e = (i, j)
|
||||
else:
|
||||
els.append(ord(letter) - 96)
|
||||
points.append((i, j))
|
||||
relief.append(els)
|
||||
|
||||
|
||||
def neighbours(node):
|
||||
n = []
|
||||
if node[0] > 0 and relief[node[0]][node[1]] + 1 >= relief[node[0] - 1][node[1]]:
|
||||
n.append((node[0] - 1, node[1]))
|
||||
if (
|
||||
node[0] < len(relief) - 1
|
||||
and relief[node[0]][node[1]] + 1 >= relief[node[0] + 1][node[1]]
|
||||
):
|
||||
n.append((node[0] + 1, node[1]))
|
||||
if node[1] > 0 and relief[node[0]][node[1]] + 1 >= relief[node[0]][node[1] - 1]:
|
||||
n.append((node[0], node[1] - 1))
|
||||
if (
|
||||
node[1] < len(relief[0]) - 1
|
||||
and relief[node[0]][node[1]] + 1 >= relief[node[0]][node[1] + 1]
|
||||
):
|
||||
n.append((node[0], node[1] + 1))
|
||||
return n
|
||||
|
||||
|
||||
def h(node):
|
||||
return abs(e[0] - node[0]) + abs(e[1] - node[1])
|
||||
|
||||
|
||||
def a_star_search(start, goal):
|
||||
queue = [start]
|
||||
gscore = {x: 9999999 for x in points}
|
||||
gscore[start] = 0
|
||||
fscore = {x: 9999999 for x in points}
|
||||
fscore[start] = h(start)
|
||||
while len(queue) > 0:
|
||||
queue = sorted({x: fscore[x] for x in queue}, key=lambda x: x[1])
|
||||
current = queue.pop(0)
|
||||
if current[0] == goal[0] and current[1] == goal[1]:
|
||||
return fscore[current]
|
||||
for n in neighbours(current):
|
||||
newg = gscore[current] + 1
|
||||
if newg < gscore[n]:
|
||||
gscore[n] = newg
|
||||
fscore[n] = newg + h(n)
|
||||
if n not in queue:
|
||||
queue.append(n)
|
||||
return None
|
||||
|
||||
|
||||
scenic = []
|
||||
for starting_point in starting_points:
|
||||
scene = a_star_search(starting_point, e)
|
||||
if scene is not None:
|
||||
scenic.append(scene)
|
||||
print(sorted(scenic)[0])
|
Loading…
Reference in new issue