Viene visualizzata un'immagine di una superficie fotografata da un satellite. L'immagine è una bitmap in cui l'acqua è contrassegnata da "." e la terra è contrassegnata da '*
'. Il gruppo adiacente di "*
" forma un'isola. (Due '*
' sono adiacenti se sono vicini orizzontali, verticali o diagonali). Il tuo compito è stampare il numero di isole nella bitmap.può contare le regioni contigue in una bitmap da migliorare su O (r * c)?
Esempio Ingresso: -
.........**
**......***
...........
...*.......
*........*.
*.........*
uscita: - 5
Qui, è la mia realizzazione che prende O(r * c)
spazio e O(r * c)
spazio dove r è totale. di righe ec è il numero totale di colonne.
#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;
}
Si prega di suggerire una logica migliore per questo problema
anche, suggerimenti per migliorare la mia soluzione è accolto favorevolmente.
La domanda è interessante, ma la descrizione del proprio algoritmo mediante la stampa del codice sorgente è scadente. Devi fornire una spiegazione. –
A volte, tuttavia, la fonte * è * la migliore documentazione. – JayC
Il tuo algoritmo è ben scritto e abbastanza preciso e non c'è algoritmo migliore del tuo, perché qualsiasi algoritmo per risolverlo dovrebbe controllare ogni stato del nodo almeno una volta e avrà lo stesso ordine dell'algoritmo. –