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