from dataclasses import dataclass from const import * from typing import List, Dict, Tuple import numpy.typing as npt @dataclass class Position: row: int col: int def dfs(grid: npt.NDArray, visited: Dict[Tuple[int, int], bool], position: Position, rows: int, cols: int) -> None: visited[(position.row, position.col)] = True row_vector = [0, 0, 1, -1] col_vector = [-1, 1, 0, 0] neighbours = [] for i in range(4): rr = position.row + row_vector[i] cc = position.col + col_vector[i] if rr < 0 or rr >= ROWS: continue elif cc < 0 or cc >= COLUMNS: continue else: p = Position(rr, cc) if (p.row, p.col) in visited: neighbours.append(p) for neighbour in neighbours: if not visited[(neighbour.row, neighbour.col)]: dfs(grid, visited, neighbour, rows, cols) def get_islands(grid: npt.NDArray, positions: List[Position], rows: int = ROWS, cols: int = COLUMNS) -> List[Position]: """it returns list of all islands roots""" visited = {} for position in positions: visited[(position.row, position.col)] = False islands = 0 roots = [] for position in positions: if not visited[(position.row, position.col)]: dfs(grid, visited, position, rows, cols) roots.append(position) islands += 1 return roots