Skip to content

Instantly share code, notes, and snippets.

@ev0rtex
Created April 27, 2018 07:46
Show Gist options
  • Save ev0rtex/ab37730b120309e9cf5d3543d0e31516 to your computer and use it in GitHub Desktop.
Save ev0rtex/ab37730b120309e9cf5d3543d0e31516 to your computer and use it in GitHub Desktop.
Sorted sizes of bodies of water
#!/usr/bin/env python3
DIAGONAL_WATER = True
def dfs_from(arr, i, j):
size = 0
if i >= 0 and j >= 0 and i < len(arr) and j < len(arr) and arr[i][j] == 0:
arr[i][j] = -1 # Mark visited
size += 1
size += dfs_from(arr, i, j + 1) # right
size += dfs_from(arr, i + 1, j) # down
size += dfs_from(arr, i, j - 1) # left
size += dfs_from(arr, i - 1, j) # up
# Diagonals?
if DIAGONAL_WATER:
size += dfs_from(arr, i - 1, j + 1) # NE
size += dfs_from(arr, i + 1, j + 1) # SE
size += dfs_from(arr, i + 1, j - 1) # SW
size += dfs_from(arr, i - 1, j - 1) # NW
return size
def water_bodies(arr, n):
bodies = []
for i in range(n):
for j in range(n):
if arr[i][j] == 0:
bodies.append(dfs_from(arr, i, j))
return bodies
def main():
n = int(input())
lines = []
for i in range(n):
lines.append(list(map(int, input().split())))
for body_size in sorted(water_bodies(lines, n)):
print(body_size)
if __name__ == '__main__':
main()
@ev0rtex
Copy link
Author

ev0rtex commented Apr 27, 2018

INPUT:

4
0 2 1 0
0 1 0 1
1 1 0 1
0 1 0 1

OUTPUT:

1
2
4

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment