Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 77 additions & 0 deletions matrix/count_islands_in_matrix.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,57 @@


class Matrix: # Public class to implement a graph
"""
This public class represents the 2-Dimensional matrix to count the number of islands.

Check failure on line 8 in matrix/count_islands_in_matrix.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (E501)

matrix/count_islands_in_matrix.py:8:89: E501 Line too long (89 > 88)
An island is the connected group of 1s including the top, down, right, left as well as

Check failure on line 9 in matrix/count_islands_in_matrix.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (E501)

matrix/count_islands_in_matrix.py:9:89: E501 Line too long (90 > 88)
the diagonal connections.

Example -

>>> matrix1 = Matrix(3, 3, [[1, 1, 0], [0, 1, 0], [1, 0, 1]])
>>> matrix1.count_islands()
1
>>> matrix2 = Matrix(2, 2, [[1, 1], [1, 1]])
>>> matrix2.count_islands()
1

"""

def __init__(self, row: int, col: int, graph: list[list[bool]]) -> None:
"""
This initialzes the matrix with the given number of rows, columns and the matrix.

Check failure on line 25 in matrix/count_islands_in_matrix.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (E501)

matrix/count_islands_in_matrix.py:25:89: E501 Line too long (89 > 88)

Args:
row (int): number of rows in the matrix
col (int): number of columns in the matrix
graph (list[list[bool]]): 2-D list of 0s and 1s representing the matrix
"""
self.ROW = row
self.COL = col
self.graph = graph

def is_safe(self, i: int, j: int, visited: list[list[bool]]) -> bool:
"""
This checks if the current cell can be included in the current island.

Args:
i (int): row index
j (int): column index
visited (list[list[bool]]): 2D list tracking the visited cells

Returns:
bool: True if the cell is valid and part of the island(1 for True and ) for False)

Check failure on line 46 in matrix/count_islands_in_matrix.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (E501)

matrix/count_islands_in_matrix.py:46:89: E501 Line too long (94 > 88)

>>> visited = [[False, False], [False, False]]
>>> graph = [[1, 0], [0, 1]]
>>> m = Matrix(2, 2, graph)
>>> m.is_safe(0, 0, visited)
1

>>> m.is_safe(0, 1, visited)
0

"""
return (
0 <= i < self.ROW
and 0 <= j < self.COL
Expand All @@ -18,6 +63,22 @@
)

def diffs(self, i: int, j: int, visited: list[list[bool]]) -> None:
"""
This is the recursive function to mark all the cells visited which are connected to (i, j) indices.

Check failure on line 67 in matrix/count_islands_in_matrix.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (E501)

matrix/count_islands_in_matrix.py:67:89: E501 Line too long (107 > 88)

Args:
i (int): row index
j (int): column index
visited (list[list[bool]]): 2D list tracking the visited cells

>>> visited = [[False, False], [False, False]]
>>> graph = [[1, 1], [0, 1]]
>>> m = Matrix(2, 2, graph)
>>> m.diffs(0, 0, visited)
>>> visited
[[True, True], [False, True]]

"""
# Checking all 8 elements surrounding nth element
row_nbr = [-1, -1, -1, 0, 0, 1, 1, 1] # Coordinate order
col_nbr = [-1, 0, 1, -1, 1, -1, 0, 1]
Expand All @@ -27,6 +88,22 @@
self.diffs(i + row_nbr[k], j + col_nbr[k], visited)

def count_islands(self) -> int: # And finally, count all islands.
"""
This counts all the islands in the given matrix.

Returns:
int: the number of islands in the given matrix.

Example -
>>> mat = Matrix(1, 1, [[1]])
>>> mat.count_islands()
1

>>> mat2 = Matrix(2, 2, [[0, 0], [0, 0]])
>>> mat2.count_islands()
0

"""
visited = [[False for j in range(self.COL)] for i in range(self.ROW)]
count = 0
for i in range(self.ROW):
Expand Down
Loading