68 lines
1.6 KiB
Python
68 lines
1.6 KiB
Python
|
|
||
|
def get_neighbors(grid, current):
|
||
|
neighbors = []
|
||
|
y, x = current
|
||
|
cur_height = ord(grid[y][x])
|
||
|
if (grid[y][x] == "S"):
|
||
|
cur_height = ord("a")
|
||
|
for i in range(-1, 2):
|
||
|
for j in range(-1, 2):
|
||
|
if i == 0 and j == 0 or (i != 0 and j != 0):
|
||
|
continue
|
||
|
if (y + i) < 0 or (y + i) >= len(grid):
|
||
|
continue
|
||
|
if (x + j) < 0 or (x + j) >= len(grid[y + i]):
|
||
|
continue
|
||
|
new_height = ord(grid[y + i][x + j])
|
||
|
if (grid[y + i][x + j] == "E"):
|
||
|
new_height = ord("z")
|
||
|
if abs(new_height - cur_height) <= 1 or new_height <= cur_height:
|
||
|
neighbors.append((y + i, x + j))
|
||
|
return neighbors
|
||
|
|
||
|
def bfs(grid, start, end):
|
||
|
queue = []
|
||
|
queue.append(start)
|
||
|
visited = {}
|
||
|
visited[start] = 0
|
||
|
while queue:
|
||
|
current = queue.pop(0)
|
||
|
if current == end:
|
||
|
return visited[current]
|
||
|
for neighbor in get_neighbors(grid, current):
|
||
|
if neighbor not in visited:
|
||
|
queue.append(neighbor)
|
||
|
visited[neighbor] = visited[current] + 1
|
||
|
return False
|
||
|
|
||
|
def main():
|
||
|
file = open("input", "r")
|
||
|
grid = file.readlines()
|
||
|
file.close()
|
||
|
|
||
|
start = (0, 0)
|
||
|
end = (0, 0)
|
||
|
|
||
|
for i in range(len(grid)):
|
||
|
for j in range(len(grid[i])):
|
||
|
if grid[i][j] == "S":
|
||
|
start = (i, j)
|
||
|
elif grid[i][j] == "E":
|
||
|
end = (i, j)
|
||
|
|
||
|
best = bfs(grid, start, end)
|
||
|
print(best)
|
||
|
|
||
|
for i in range(len(grid)):
|
||
|
for j in range(len(grid[i])):
|
||
|
if grid[i][j] == "a":
|
||
|
this_as_start = bfs(grid, (i, j), end)
|
||
|
if this_as_start and this_as_start < best:
|
||
|
best = this_as_start
|
||
|
|
||
|
print(best)
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
main()
|