You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2 yıl önce
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. def parse_grid(text):
  2. grid = {}
  3. for y, row in enumerate(text):
  4. for x, v in enumerate(row):
  5. grid[complex(x, y)] = v if v in 'SE' else ord(v)
  6. return grid
  7. def print_grid(mapping):
  8. xmin, *_, xmax = {int(p.real) for p in mapping}
  9. ymin, *_, ymax = {int(p.imag) for p in mapping}
  10. for y in range(ymin, ymax + 1):
  11. for x in range(xmin, xmax + 1):
  12. print(mapping.get(complex(x, y), ' '), end=' ')
  13. print()
  14. def shortest_path(starts, ends, evolve):
  15. starts = {k: [k] for k in starts}
  16. known = starts.copy()
  17. while starts:
  18. old = list(starts)[0]
  19. path = starts.pop(old)
  20. starts |= {new: path + [new] for new in evolve(old) if new not in known}
  21. known |= starts
  22. for final in set(starts) & set(ends):
  23. # print_grid({k: '.' for k in known[final]})
  24. return known[final]
  25. def main():
  26. text = open(0).read().splitlines()
  27. grid = parse_grid(text)
  28. rev = {v: k for k, v in grid.items()}
  29. start, end = rev['S'], rev['E']
  30. grid[start], grid[end] = ord('a'), ord('z')
  31. dof = [1, -1, 1j, -1j]
  32. evolve = lambda old: {old + step for step in dof if is_valid(old, step)}
  33. is_valid = lambda old, step: old + step in grid and grid[old + step] - grid[old] <= 1
  34. print(len(shortest_path({start}, {end}, evolve)) - 1)
  35. starts = {k for k, v in grid.items() if v == ord('a')}
  36. print(len(shortest_path(starts, {end}, evolve)) - 1)
  37. main()