// Cuenta las islas de un mapa: grupos de # unidos por arriba, abajo, izquierda o derecha.
#include <stdio.h>

#define ROWS 6
#define COLS 14

// Hunde toda la isla que contiene a (row, col): cada # visitado pasa a ser ~.
void sink(char map[][COLS + 1], int row, int col) {
    if (row < 0 || row >= ROWS || col < 0 || col >= COLS) {
        return;
    }
    if (map[row][col] != '#') {
        return;
    }
    map[row][col] = '~';
    sink(map, row - 1, col);
    sink(map, row + 1, col);
    sink(map, row, col - 1);
    sink(map, row, col + 1);
}

// Cuidado: destruye el mapa que recibe. Al terminar, ya no queda ningún #.
int count_islands(char map[][COLS + 1]) {
    int islands = 0;
    for (int row = 0; row < ROWS; row++) {
        for (int col = 0; col < COLS; col++) {
            if (map[row][col] == '#') {
                islands++;
                sink(map, row, col);
            }
        }
    }
    return islands;
}

int main(void) {
    char map[ROWS][COLS + 1] = {
        "##......#.....",
        "##.....###..#.",
        "........#...#.",
        "...#........#.",
        "....#...##....",
        ".........##...",
    };

    for (int row = 0; row < ROWS; row++) {
        printf("%s\n", map[row]);
    }
    printf("islas: %d\n", count_islands(map));
    return 0;
}
