¿Se puede mejorar el conteo de regiones contiguas en un mapa de bits sobre O (r * c)?

Se le da una imagen de una superficie fotografiada por un satélite. La imagen es un mapa de bits donde el agua está marcada con '.' y la tierra está marcada por*'. Grupo adyacente de*forman una isla (Dos*'son adyacentes si son vecinos horizontales, verticales o diagonales). Su tarea es imprimir el número de islas en el mapa de bits.

Ejemplo de entrada: -

.........**
**......***
...........
...*.......
*........*.
*.........*

Salida: - 5

Aquí, es mi implementación la que llevaO(r * c) espacio yO(r * c) espacio donde r es el no total. de filas yc es el no total de cols.

#include <stdio.h>
#define COLS 12

void markVisted(char map[][COLS], int visited[][COLS], int row, int col, int rowCount)
{
    if((row < 0) || (row >= rowCount) || (col < 0) || (col >= COLS) || (map[row][col] != '*') || (visited[row][col] == 1)) return;

    visited[row][col] = 1;

    //calling neighbours
    markVisted(map, visited, row+1, col, rowCount);
    markVisted(map, visited, row, col+1, rowCount);
    markVisted(map, visited, row-1, col, rowCount);
    markVisted(map, visited, row, col-1, rowCount);
    markVisted(map, visited, row+1, col+1, rowCount);
    markVisted(map, visited, row-1, col-1, rowCount);
    markVisted(map, visited, row-1, col+1, rowCount);
    markVisted(map, visited, row+1, col-1, rowCount);
}
int countIslands(char map[][COLS], int visited[][COLS], int rowCount)
{
    int i, j, count = 0;
    for(i=0; i<rowCount; ++i){
        for(j=0; j<COLS; ++j){

            if((map[i][j] == '*') && (visited[i][j] == 0)){
                ++count;
                markVisted(map, visited, i, j, rowCount);
            }
        }
    }
    return count;
}

int main()
{
    char map[][COLS] = {
                    "*..........",
                    "**........*",
                    "...........",
                    "...*.......",
                    "*........*.",
                    "..........*"               
                    };
    int rows = sizeof(map)/sizeof(map[0]);
    int visited[rows][COLS], i, j;  

    for(i=0; i<rows; ++i){
        for(j=0; j<COLS; ++j) visited[i][j] = 0;
    }

    printf("No. of islands = %d\n", countIslands(map, visited, rows));


    return 0;
}

Por favor sugiera alguna lógica mejor para este problema.
También, las sugerencias para mejorar mi solución son bienvenidas.

Respuestas a la pregunta(5)

Su respuesta a la pregunta