counting islands with dfs #29

Merged
s464961 merged 1 commits from genetic_alg_fitness into genetic_alg 2022-05-31 21:37:26 +02:00
2 changed files with 46 additions and 0 deletions

View File

@ -1,7 +1,51 @@
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 count_islands(grid: npt.NDArray, positions: List[Position], rows: int = ROWS, cols: int = COLUMNS) -> int:
visited = {}
for position in positions:
visited[(position.row, position.col)] = False
islands = 0
for position in positions:
if not visited[(position.row, position.col)]:
dfs(grid, visited, position, rows, cols)
islands += 1
return islands

View File

@ -1,5 +1,6 @@
from map_importer_exporter import export_map
from genome import Genome
from common import count_islands
def main() -> None:
@ -7,6 +8,7 @@ def main() -> None:
print(example_genome.knights_red)
print(example_genome.knights_blue)
print(example_genome.grid)
print(count_islands(example_genome.grid, example_genome.sands + example_genome.waters))
# export_map(example_genome.grid) fixme: FileNotFoundError