czy można policzyć ciągłe regiony bitmapy w O (r * c)?

Otrzymujesz obraz powierzchni sfotografowanej przez satelitę. Obraz jest mapą bitową, na której woda jest oznaczona „.” a ziemia jest oznaczona przez „*” Przylegająca grupa '*tworzy wyspę. (Dwa*'sąsiadują, jeśli są sąsiadami poziomymi, pionowymi lub ukośnymi). Twoim zadaniem jest wydrukowanie liczby wysp w mapie bitowej.

Przykładowe dane wejściowe: -

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

Wyjście: - 5

Tutaj jest moja implementacjaO(r * c) przestrzeń iO(r * c) spacja, gdzie r jest całkowitą nie. wierszy c oznacza całkowitą liczbę braków.

#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;
}

proszę zaproponować lepszą logikę tego problemu
również sugestie dotyczące ulepszenia mojego rozwiązania są mile widziane.

questionAnswers(5)

yourAnswerToTheQuestion