08_trees.py 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #!/usr/bin/env python3
  2. import sys
  3. def parse(f):
  4. first = next(f).rstrip()
  5. grid = list(map(int, first))
  6. for line in f:
  7. grid.extend(map(int, line.rstrip()))
  8. return grid, len(first)
  9. def visible(grid, size):
  10. vis = [False] * len(grid)
  11. def walk(start, step):
  12. prev = -1
  13. for i in range(start, start + step * size, step):
  14. tree = grid[i]
  15. if tree > prev:
  16. vis[i] = True
  17. prev = tree
  18. for i in range(size):
  19. walk(i, size)
  20. walk(len(grid) - i - 1, -size)
  21. walk(i * size, 1)
  22. walk((i + 1) * size - 1, -1)
  23. return sum(vis)
  24. def score(grid, size, i):
  25. def walk(step, stop):
  26. vis = 0
  27. for j in range(i + step, stop, step):
  28. vis += 1
  29. if grid[j] >= grid[i]:
  30. break
  31. j += step
  32. return vis
  33. return walk(1, i + size - i % size) \
  34. * walk(-1, i - i % size - 1) \
  35. * walk(size, len(grid)) \
  36. * walk(-size, -1)
  37. grid, size = parse(sys.stdin)
  38. print(visible(grid, size))
  39. print(max(score(grid, size, i) for i in range(len(grid))))