advent-of-code/2022-python/output/day_12.py

59 lines
1.5 KiB
Python
Raw Normal View History

import re
from collections import deque, Counter, defaultdict
from heapq import heappop, heappush
from itertools import compress, combinations, chain, permutations
from output import matrix, D, DDa, vvdbg, DD, ADJ, ints, mhd, mdbg, vdbg, cw, ccw, bk
def solve(data):
M, H, W = matrix(data)
E = S = None
p1 = p2 = H * W
SP = []
for rr in range(H):
for cc in range(W):
if M[rr][cc] == "E":
E = (rr, cc)
if M[rr][cc] == "S":
S = (rr, cc)
SP.append((rr, cc))
if M[rr][cc] == "a":
SP.append((rr, cc))
M = [list(row) for row in M]
for rc, v in [(S, "a"), (E, "z")]:
r, c = rc
M[r][c] = v
for sp in SP:
Q = [(sp, ord("a"), 0)]
seen = set()
while Q:
yx, e, s = Q.pop(0)
if yx in seen:
continue
seen.add(yx)
if yx == E:
if sp == S:
p1 = s
p2 = min(p2, s)
y, x = yx
for dy, dx in D:
if 0 <= y + dy < H and 0 <= x + dx < W:
n = ord(M[y + dy][x + dx])
if n - e <= 1:
Q.append(((y + dy, x + dx), n, s + 1))
return p1, p2
if __name__ == "__main__":
with open("./input/12.txt", "r") as f:
inp = f.read().strip()
p1, p2 = solve(inp)
print(p1)
print(p2)
assert p1 == 517
assert p2 == 512