Advertisement
Guest User

Untitled

a guest
Aug 27th, 2016
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.20 KB | None | 0 0
  1. from collections import namedtuple
  2.  
  3. S = int(input())
  4. elevation = [list(map(int, input().split())) for _ in range(S)]
  5.  
  6. Point = namedtuple('Point', 'x y')
  7. valid_xy = [Point(x, y) for x in range(S) for y in range(S)]
  8. water = [[1 for x in range(S)] for y in range(S)]
  9.  
  10.  
  11. def neighbours(x, y):
  12. possible = (Point(x, y-1), Point(x-1, y),
  13. Point(x, y+1), Point(x+1, y))
  14. return (n for n in possible if n in valid_xy)
  15.  
  16.  
  17. def lowest_neighbour(x, y):
  18. lowest_point = None
  19. lowest_elev = elevation[x][y]
  20. for n in neighbours(x, y):
  21. if elevation[n.x][n.y] < lowest_elev:
  22. lowest_elev = elevation[n.x][n.y]
  23. lowest_point = Point(n.x, n.y)
  24. return lowest_point
  25.  
  26.  
  27. def drain(x, y):
  28. lowest = lowest_neighbour(x, y)
  29. if lowest:
  30. water[lowest.x][lowest.y] += water[x][y]
  31. water[x][y] = 0
  32. return True
  33.  
  34. # Loop through all valid plots and drain them (This isn't elegant!)
  35. updated = True
  36. while updated:
  37. updated = False
  38. for p in valid_xy:
  39. if water[p.x][p.y]:
  40. if drain(*p):
  41. updated = True
  42.  
  43. basins = [water[p.x][p.y] for p in valid_xy if water[p.x][p.y]]
  44. basins.sort(reverse=True)
  45.  
  46. for x in basins: print(x, end=' ')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement