py_island_matrix_counter · Python
▶ Aprender py_island_matrix_counter (Python) paso a paso · explicación de py_island_matrix_counter
Código línea a línea
Tres columnas: el código, el trozo del subject o del main que obliga a escribir esa línea, y el por qué.
py_island_matrix_counter.py
| Código | Subject | Por qué |
|---|---|---|
def island_matrix_counter(matrix: list[list[str]]) -> int: | def island_matrix_counter(matrix: list[list[str]]) -> int: | Firma del subject. Devuelve un int. |
rows = len(matrix) | An empty matrix (or matrix with no rows) should return 0. | Número de filas; 0 si está vacía. |
cols = len(matrix[0]) if rows else 0 | An empty matrix (or matrix with no rows) should return 0. | Ancho de la primera fila. El if rows evita matrix[0] sobre una lista vacía. |
seen = set() | DFS/BFS traversal or matrix mutation can be used to explore each complete island. | Celdas ya contadas. Un set en vez de pintar la matriz: así no muto la entrada. |
count = 0 | returns the total number of islands | Islas encontradas. |
for r in range(rows): | Count each separate island exactly once. | Recorro toda la matriz celda a celda. |
for c in range(cols): | Columna a columna. | |
if matrix[r][c] != "1" or (r, c) in seen: | "1" represents land. "0" represents water. | Agua, o tierra que ya pertenece a una isla contada: paso de largo. Comparo con "1" (string), no 1. |
continue | Siguiente celda. | |
count += 1 | Count each separate island exactly once. | Tierra nueva = isla nueva. Ahora la recorro entera para no volver a contarla. |
stack = [(r, c)] | DFS/BFS traversal | DFS con una pila a mano: sin recursión, sin límite de profundidad. |
seen.add((r, c)) | Marco al meter en la pila, no al sacar: evita duplicados en la pila. | |
while stack: | Mientras queden celdas de esta isla por expandir. | |
y, x = stack.pop() | Saco una celda. | |
for ny, nx in ((y - 1, x), (y + 1, x), (y, x - 1), (y, x + 1)): | Cells are considered connected only when they are directly adjacent horizontally (left, right) or vertically (up, down). | Los 4 vecinos: arriba, abajo, izquierda, derecha. Sin diagonales. |
if 0 <= ny < rows and 0 <= nx < cols and matrix[ny][nx] == "1" and (ny, nx) not in seen: | Diagonal cells do not count as connected. | Dentro del tablero, tierra y sin visitar. Los límites van primero: así matrix[ny][nx] nunca se sale. |
seen.add((ny, nx)) | Marco y encolo. | |
stack.append((ny, nx)) | Lo expandiré después. | |
return count | returns the total number of islands | El total. |