您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

61 行
1.5KB

  1. import collections
  2. import re
  3. import sys
  4. def read_in():
  5. grid = collections.defaultdict(lambda: ' ')
  6. for _ in sys.stdin.read().splitlines():
  7. _ = _.replace(',', ';')
  8. _ = re.sub(r'(\d+)\.\.(\d+)', r'range(\1, \2 + 1)', _)
  9. _ = re.sub(r'=(\d+)', r'=[\1]', _)
  10. temp = {}
  11. exec(_, temp)
  12. grid.update({(X, Y): '#' for X in temp['x'] for Y in temp['y']})
  13. return grid
  14. def flow(grid, start, ymax):
  15. stack = [start]
  16. while stack:
  17. x, y = stack.pop()
  18. grid[x, y] = '~'
  19. if y >= ymax:
  20. break
  21. for dx, dy in [(1, 0), (-1, 0), (0, 1)]:
  22. new = x + dx, y + dy
  23. if dy == 1 and grid[new] == '|':
  24. stack.clear()
  25. break
  26. if grid[new] == ' ':
  27. stack.append(new)
  28. drain(grid, (x, y), ymax)
  29. def drain(grid, end, ymax):
  30. stack = [end]
  31. while stack:
  32. x, y = stack.pop()
  33. grid[x, y] = '|'
  34. left, right, below = grid[x - 1, y], grid[x + 1, y], grid[x, y + 1]
  35. if all([right == ' ', left == '|', below != '|']):
  36. flow(grid, (x + 1, y), ymax)
  37. for dx, dy in [(-1, 0), (1, 0), (0, -1)]:
  38. new = x + dx, y + dy
  39. if grid[new] == '~':
  40. stack.append(new)
  41. grid = read_in()
  42. ymin, *_, ymax = sorted(y for x, y in grid if grid[x, y] == '#')
  43. flow(grid, (500, ymin), ymax)
  44. counter = collections.Counter(grid.values())
  45. print(counter['~'] + counter['|'])
  46. print(counter['~'])