Pond Sizes
You have an integer matrix representing a plot of land, where the value at that location represents the height above sea level. A value of zero indicates water. A pond is a region of water connected vertically, horizontally, or diagonally. The size of the pond is the total number of connected water cells. Write a method to compute the sizes of all ponds in the matrix
from typing import List
def _find_ponds(mat: List[List[int]], row: int, col: int, traversed_data: List[str]) -> int:
if row < 0 or row >= len(mat) or col < 0 or col >= len(mat[0]):
return 0
if mat[row][col] != 0 or (str(row) + str(col) in traversed_data):
return 0
number_of_ponds = 1
traversed_data.append(str(row) + str(col))
# recursively iterate to surrounding
number_of_ponds += _find_ponds(mat, row, col - 1, traversed_data)
number_of_ponds += _find_ponds(mat, row, col + 1, traversed_data)
number_of_ponds += _find_ponds(mat, row + 1, col - 1, traversed_data)
number_of_ponds += _find_ponds(mat, row + 1, col, traversed_data)
number_of_ponds += _find_ponds(mat, row + 1, col + 1, traversed_data)
return number_of_ponds
def pond_sizes(mat: List[List[int]]) -> List[int]:
"""
You have an integer matrix representing a plot of land, where the value at that location
represents the height above sea level. A value of zero indicates water. A pond is a region of water
connected vertically, horizontally, or diagonally. The size of the pond is the total number of
connected water cells. Write a method to compute the sizes of all ponds in the matrix
"""
result = []
traversed = []
for i in range(0, len(mat)):
for j in range(0, len(mat[0])):
ponds = _find_ponds(mat, i, j, traversed)
if ponds > 0:
result.append(ponds)
print(result)
return sorted(result)
if __name__ == '__main__':
assert pond_sizes([
[1, 2, 1, 0],
[1, 1, 0, 1],
[1, 1, 0, 1],
[0, 0, 1, 1]
]) == [5]
assert pond_sizes([
[0, 0, 0, 0],
[1, 1, 1, 1],
[1, 1, 1, 1],
[0, 1, 1, 0]
]) == [1, 1, 4]
assert pond_sizes([
[1, 2, 1, 0],
[1, 1, 1, 1],
[1, 1, 1, 1],
[0, 0, 0, 0]
]) == [1, 4]
assert pond_sizes([
[0, 2, 1, 0],
[0, 1, 0, 1],
[0, 1, 0, 1],
[0, 1, 1, 0]
]) == [4, 4]
assert pond_sizes([
[0, 2, 1, 1],
[0, 1, 0, 1],
[0, 1, 0, 1],
[0, 1, 0, 1]
]) == [3, 4]
assert pond_sizes([
[0, 2, 1, 1],
[0, 0, 0, 1],
[0, 1, 0, 1],
[0, 1, 0, 1]
]) == [8]
assert pond_sizes([
[1, 2, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]
]) == []
assert pond_sizes([
[1, 2, 1, 0],
[1, 1, 0, 1],
[1, 1, 0, 1],
[1, 0, 1, 1]
]) == [4]
Updated on 2020-06-27