py_island_matrix_counter

Código comentado línea a línea y paso a paso:

Entregas: py_island_matrix_counter.py con island_matrix_counter(matrix). Rank 05 · nivel 2.

Qué pide (en palabras normales)

Subject (enunciado original)
Write a function island_matrix_counter(matrix) that receives a 2D matrix containing "1" and "0" string values and returns the total number of islands.

An island is a group of connected "1" cells. Cells are considered connected only when they are directly adjacent horizontally (left, right) or vertically (up, down). Diagonal cells do not count as connected.

Requirements:
- "1" represents land.
- "0" represents water.
- Count each separate island exactly once.
- An empty matrix (or matrix with no rows) should return 0.
- DFS/BFS traversal or matrix mutation can be used to explore each complete island.

Expected file: py_island_matrix_counter.py
Function signature:
def island_matrix_counter(matrix: list[list[str]]) -> int:

Examples:
island_matrix_counter([["1", "1", "1", "1", "0"], ["1", "1", "1", "0", "0"], ["1", "1", "1", "1", "0"], ["0", "0", "0", "0", "0"]])
=> 1
island_matrix_counter([["1", "1", "0", "0", "0"], ["1", "1", "0", "0", "0"], ["0", "0", "1", "0", "0"], ["0", "0", "0", "1", "1"]])
=> 3
island_matrix_counter([])
=> 0

La idea: flood fill

if matrix[r][c] != "1" or (r, c) in seen:
    continue
count += 1
stack = [(r, c)]
seen.add((r, c))
while stack:
    y, x = stack.pop()
    for ny, nx in ((y - 1, x), (y + 1, x), (y, x - 1), (y, x + 1)):
        if 0 <= ny < rows and 0 <= nx < cols and matrix[ny][nx] == "1" and (ny, nx) not in seen:
            seen.add((ny, nx))
            stack.append((ny, nx))

Cada vez que piso tierra nueva, sumo una isla y la "inundo" entera marcando todas sus celdas en seen. Así cuando el recorrido principal pase por ellas, las salta.

Por qué una pila y no recursión

La versión recursiva es más corta pero una isla grande (1000+ celdas en línea) revienta el límite de recursión de Python. La pila hace lo mismo sin ese riesgo. Marcar al meter en la pila, no al sacar, evita meter la misma celda dos veces.

Trampas