Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में विशिष्ट द्वीपों की संख्या


मान लीजिए हमारे पास एक बाइनरी 2D ऐरे ग्रिड है, यहां एक द्वीप 1's (भूमि) का एक समूह है जो 4-दिशात्मक रूप से जुड़ा हुआ है (क्षैतिज या लंबवत)। हम मान सकते हैं कि ग्रिड के चारों किनारे पानी से घिरे हैं। हमें विशिष्ट द्वीपों की संख्या गिननी है।

एक द्वीप को दूसरे के समान माना जाता है जब एक द्वीप को अनुवादित करके (घुमाए या प्रतिबिंबित किए बिना) दूसरे के बराबर बनाया जा सकता है।

उदाहरण के लिए, यदि इनपुट ग्रिड है:

11011
10000
00001
11011

तो आउटपुट 3 होगा।

हल करने की विधि

हम DFS का उपयोग करके प्रत्येक द्वीप के आकार को एक स्ट्रिंग के रूप में एनकोड करेंगे:

  • dfs() फ़ंक्शन परिभाषित करें जो x, y, ग्रिड, अस्थायी स्ट्रिंग, और दिशा वर्ण लेता है।
  • यदि सीमा से बाहर या पानी है, तो लौटें।
  • ग्रिड[x][y] = 0 सेट करें (देखा गया चिह्नित करें)।
  • दिशा वर्ण को अस्थायी स्ट्रिंग में जोड़ें।
  • चार दिशाओं में रिकर्सिवली कॉल करें: दाएं (r), बाएं (l), नीचे (d), ऊपर (u)।
  • बैकट्रैकिंग के लिए 'b' जोड़ें।
  • मुख्य विधि में:
    • ret = 0, visited सेट परिभाषित करें।
    • प्रत्येक सेल के लिए, यदि भूमि है, तो खाली स्ट्रिंग aux से dfs शुरू करें।
    • यदि aux visited में नहीं है, तो ret बढ़ाएं और visited में डालें।
  • ret लौटाएं।

उदाहरण

बेहतर समझ के लिए निम्न कार्यान्वयन देखें:

#include <bits/stdc++.h> using namespace std; int dir[4][2] = {{1, 0}, {-1, 0}, {0, -1}, {0, 1}}; class Solution { public:    void dfs(int x, int y, vector < vector <int> >& grid, string& temp, char c){       if (x < 0 || y < 0 || x >= grid.size() || y >= grid[0].size() || !grid[x][y])          return;       grid[x][y] = 0;       temp += c;       dfs(x + 1, y, grid, temp, 'r');       dfs(x - 1, y, grid, temp, 'l');       dfs(x, y + 1, grid, temp, 'd');       dfs(x, y - 1, grid, temp, 'u');       temp += 'b';    }    int numDistinctIslands(vector<vector<int>>& grid) {       int ret = 0;       set<string> visited;       for (int i = 0; i < grid.size(); i++) {          for (int j = 0; j < grid[0].size(); j++) {             if (grid[i][j]) {                string aux = "";                dfs(i, j, grid, aux, 's');                if (!visited.count(aux)) {                   ret++;                   visited.insert(aux);                }             }          }       }       return ret;    } }; main(){    Solution ob;    vector<vector<int>> v =    {{1,1,0,1,1},{1,0,0,0,0},{0,0,0,0,1},{1,1,0,1,1}};    cout<<(ob.numDistinctIslands(v)); }

इनपुट

{{1,1,0,1,1},{1,0,0,0,0},{0,0,0,0,1},{1,1,0,1,1}}

आउटपुट

3

  1. - C++ में डिस्जॉइंट सेट का उपयोग करके द्वीपों की संख्या खोजना

    समस्या विवरण इस समस्या में, हमें एक 2D बाइनरी मैट्रिक्स दिया गया है। हमारा कार्य डिस्जॉइंट सेट का उपयोग करके द्वीपों की संख्या खोजना है। द्वीप मैट्रिक्स में 1 या अधिक जुड़े 1 का समूह है। उदाहरण इनपुट bin[][] = {{1, 0, 0, 0}, {0, 1, 0, 1}, {0, 0, 0, 0}, {0, 0, 1, 0}

  1. - C++ में मितव्ययी संख्या (Frugal Number)

    इस समस्या में, हमें एक धनात्मक पूर्णांक N दिया गया है। हमारा कार्य यह जांचने के लिए एक प्रोग्राम बनाना है कि दी गई संख्या मितव्ययी संख्या है या नहीं। मितव्ययी संख्या (FRUGAL NUMBER) − एक संख्या जिसके अंकों की संख्या उस संख्या के अभाज्य गुणनखंडन में अंकों की संख्या से सख्ती से अधिक है। उदाहरण &

  1. C++ में पेंटाटोप संख्या C++ में पेंटाटोप संख्या

    एक पेंटाटोप संख्या को पास्कल के त्रिभुज में पांचवीं संख्या के रूप में वर्णित किया गया है। अब, चूंकि यह पांचवीं संख्या है, इसका मतलब है कि पास्कल के त्रिभुज में कम से कम पांच संख्याएं होनी चाहिए, इसलिए इस श्रृंखला की पहली संख्या 1 4 6 4 1 से शुरू होती है जो पास्कल के त्रिभुज की चौथी पंक्ति है। तो, इस