import os import numpy from collections import deque input = open(os.path.dirname(__file__) + "/input.txt", "r").readlines() start = () end = () terrain = [] for Y, y in enumerate(input): y = y.strip() cur = [] for X, x in enumerate(y): h = ord(x)-ord('a')+1 if (x == 'S'): h = 1 start = (Y, X) if (x == 'E'): h = 26 end = (Y, X) cur.append(h) terrain.append(cur) H = len(terrain) W = len(terrain[0]) neighbours = [(-1, 0), (0, 1), (1, 0), (0, -1)] def find_path(coords): paths = [] for n in neighbours: check = tuple(numpy.add(coords, n)) if 0 <= check[0] < H and 0 <= check[1] < W and coords != check: if terrain[check[0]][check[1]] <= terrain[coords[0]][coords[1]]+1: paths.append(check) return paths def solve(p): Q = deque() if (p == 2): for y in range(H): for x in range(W): if terrain[y][x] == 1: Q.append(((y, x), 0)) else: Q.append((start, 0)) V = set() while Q: cur_pos, d = Q.popleft() if cur_pos in V: continue V.add(cur_pos) if cur_pos == end: return d tocheck = find_path(cur_pos) for node in tocheck: Q.append((node, d+1)) print(solve(1)) print(solve(2))