आपको उपग्रह द्वारा चित्रित सतह की एक छवि दी गई है। छवि एक बिटमैप है जहां पानी को '।' द्वारा चिह्नित किया जाता है। और भूमि को *
'द्वारा चिह्नित किया गया है। '*
के एक समूह का एक समूह है। (दो '*
' क्षैतिज, ऊर्ध्वाधर या विकर्ण पड़ोसियों के निकट हैं)। आपका काम बिटमैप में द्वीपों की संख्या मुद्रित करना है।ओ (आर * सी) पर बिटमैप में संगत क्षेत्रों की गणना कर सकते हैं?
उदाहरण इनपुट: -
.........**
**......***
...........
...*.......
*........*.
*.........*
आउटपुट: - 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;
}
इस समस्या
भी सुझावों को बेहतर बनाने के लिए अपने समाधान का स्वागत किया है के लिए कुछ बेहतर तर्क का सुझाव दें।
प्रश्न दिलचस्प है, लेकिन स्रोत कोड प्रिंट करके आपके एल्गोरिदम का वर्णन करना खराब है। आपको एक स्पष्टीकरण प्रदान करने की आवश्यकता है। –
कभी-कभी, स्रोत * * सबसे अच्छा प्रलेखन है। – JayC
आपका एल्गोरिदम अच्छी तरह से लिखा गया है और पर्याप्त ठीक है और आपके से कोई एल्गोरिदम बेहतर नहीं है, क्योंकि इसे हल करने के लिए किसी भी एल्गोरिदम को कम से कम एक बार प्रत्येक नोड स्थिति की जांच करनी चाहिए और आपके एल्गोरिदम के समान ऑर्डर होगा। –