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)
- Matriz de strings
"1"(tierra) y"0"(agua). Cuenta las islas: grupos de unos pegados en horizontal o vertical. Diagonal no cuenta. - Vacía → 0.
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
- Son strings:
== "1", no== 1. - No pintes la matriz de entrada (
matrix[r][c] = "0"): el corrector detecta mutaciones. Usaseen. - Comprueba los límites antes de indexar. En Python
matrix[-1]no falla: devuelve la última fila y te da islas fantasma.