59 lines
1.5 KiB
Python
59 lines
1.5 KiB
Python
|
|
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
|