Можно ли улучшить подсчет смежных областей в растровом изображении по сравнению с O (r * c)?

Вам предоставляется изображение поверхности, сфотографированной спутником. Изображение представляет собой растровое изображение, на котором вода помечена как "." и земля помечена & apos;*& APOS ;. Смежная группа*образуют остров. (Два*& APOS; являются смежными, если они являются горизонтальными, вертикальными или диагональными соседями). Ваша задача - напечатать количество островов в растровом изображении.

Пример ввода: -

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

Выход: - 5

Вот моя реализация, которая занимаетO(r * c) пространство иO(r * c) пространство, где г всего нет. строк и с общее количество столбцов.

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

please suggest some better logic for this problem
Также приветствуются предложения по улучшению моего решения.

Ответы на вопрос(5)

Ваш ответ на вопрос