day12 - improved

This commit is contained in:
Stefan Harmuth 2022-12-14 19:35:58 +01:00
parent 4c3332a731
commit cfe67b7889

View File

@ -1,3 +1,4 @@
from collections import deque
from heapq import heappush, heappop from heapq import heappush, heappop
from tools.aoc import AOCDay from tools.aoc import AOCDay
from tools.coordinate import Coordinate, DistanceAlgorithm from tools.coordinate import Coordinate, DistanceAlgorithm
@ -47,6 +48,32 @@ def get_dijkstra_path(height_map: Grid, start: Coordinate, end: Coordinate) -> i
return steps return steps
def get_bfs_path(height_map: Grid, end: Coordinate) -> int:
v = {end: None}
q = deque()
q.append(end)
while q:
cur = q.popleft()
cur_v = height_map.get(cur)
if cur_v == 0:
end = cur
break
for c in height_map.getNeighboursOf(cur, includeDiagonal=False):
if c in v or height_map.get(c) + 1 < cur_v:
continue
v[c] = cur
q.append(c)
steps = 0
while end in v:
steps += 1
end = v[end]
return steps
class Day(AOCDay): class Day(AOCDay):
inputs = [ inputs = [
[ [
@ -84,15 +111,8 @@ class Day(AOCDay):
return get_dijkstra_path(*self.get_map()) return get_dijkstra_path(*self.get_map())
def part2(self) -> Any: def part2(self) -> Any:
min_steps = float("inf") height_map, _, end = self.get_map()
height_map, start, end = self.get_map() return get_bfs_path(height_map, end) - 1
for c in height_map.getActiveCells():
if height_map.get(c) == 0:
steps_from_here = get_dijkstra_path(height_map, c, end)
if steps_from_here is not None and steps_from_here + 1 < min_steps:
min_steps = steps_from_here + 1
return min_steps - 1
if __name__ == '__main__': if __name__ == '__main__':