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

C++ में एक बड़ा द्वीप बनाना (Making A Large Island) - ग्रिड में अधिकतम द्वीप क्षेत्रफल


समस्या विवरण

हमें एक 2D ग्रिड दिया गया है जिसमें बाइनरी मान (0 और 1) हैं। हम अधिकतम एक 0 को 1 में बदल सकते हैं। उसके बाद हमें सबसे बड़े द्वीप (island) का आकार ज्ञात करना है। यहां द्वीप 4-दिशात्मक रूप से (ऊपर, नीचे, बाएं, दाएं) जुड़े 1s का समूह है।

उदाहरण

इनपुट

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

आउटपुट

3

व्याख्या

यदि हम एक 0 को 1 में बदलकर दो 1s को जोड़ते हैं, तो हमें क्षेत्रफल 3 का द्वीप मिलता है।

समाधान दृष्टिकोण (DFS + घटक लेबलिंग)

  1. DFS का उपयोग करके प्रत्येक द्वीप को एक अद्वितीय सूचकांक (index ≥ 2) से लेबल करें और उसका क्षेत्रफल रिकॉर्ड करें।
  2. प्रत्येक 0 सेल के लिए, उसके 4 पड़ोसियों की जांच करें। अद्वितीय पड़ोसी द्वीप सूचकांकों को एकत्र करें।
  3. उस 0 को 1 में बदलने पर नया क्षेत्रफल = 1 + उन अद्वितीय द्वीपों के क्षेत्रफलों का योग।
  4. सभी 0 सेल्स के लिए अधिकतम क्षेत्रफल लौटाएं।

कार्यकारी प्रोग्राम

#include <bits/stdc++.h>
using namespace std;

int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};

class Solution {
public:
    int dfs(vector<vector<int>>& grid, int i, int j, int idx) {
        if (i < 0 || j < 0 || i >= grid.size() || j >= grid[0].size() || grid[i][j] != 1)
            return 0;
        int ret = 1;
        grid[i][j] = idx;
        for (int k = 0; k < 4; k++) {
            int ni = dir[k][0] + i;
            int nj = dir[k][1] + j;
            ret += dfs(grid, ni, nj, idx);
        }
        return ret;
    }
    
    int largestIsland(vector<vector<int>>& grid) {
        int ret = 0;
        int idx = 2;
        vector<int> area(2);
        int n = grid.size();
        int m = grid[0].size();
        
        // सभी द्वीपों को लेबल करें और क्षेत्रफल रिकॉर्ड करें
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (grid[i][j] == 1) {
                    area.push_back(dfs(grid, i, j, idx));
                    ret = max(ret, area.back());
                    idx++;
                }
            }
        }
        
        // प्रत्येक 0 को 1 में बदलने का प्रयास करें
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (grid[i][j] == 0) {
                    set<int> idxs;
                    for (int k = 0; k < 4; k++) {
                        int ni = i + dir[k][0];
                        int nj = j + dir[k][1];
                        if (ni < 0 || nj < 0 || ni >= grid.size() || nj >= grid[0].size()) continue;
                        if (grid[ni][nj]) {
                            idxs.insert(grid[ni][nj]);
                        }
                    }
                    int temp = 1;
                    for (int it : idxs) {
                        temp += area[it];
                    }
                    ret = max(ret, temp);
                }
            }
        }
        return ret;
    }
};

int main() {
    Solution ob;
    vector<vector<int>> v = {{1,0},{0,1}};
    cout << ob.largestIsland(v);
    return 0;
}

आउटपुट

3
  1. C++ में लाइन रिफ्लेक्शन - Y-अक्ष के समानांतर सममित रेखा जांचें C++ में लाइन रिफ्लेक्शन - Y-अक्ष के समानांतर सममित रेखा जांचें

    समस्या विवरण मान लीजिए हमारे पास 2D तल पर n बिंदु हैं, हमें जांचना है कि क्या y-अक्ष के समानांतर कोई रेखा है जो दिए गए बिंदुओं को सममित रूप से प्रतिबिंबित करती है, दूसरे शब्दों में, जांचें कि क्या कोई ऐसी रेखा मौजूद है जो सभी बिंदुओं को दी गई रेखा पर प्रतिबिंबित करने के बाद मूल बिंदुओं का समुच्चय प

  1. C++ में डायगोनल ट्रैवर्स II C++ में डायगोनल ट्रैवर्स II

    मान लीजिए हमारे पास nums नामक लिस्ट ऑफ लिस्ट है, हमें nums के सभी एलिमेंट्स को डायगोनल क्रम में दिखाना है।इसलिए, यदि इनपुट हैतो आउटपुट होगा [1,6,2,8,7,3,9,4,12,10,5,13,11,14,15,16]इसे हल करने के लिए, हम निम्न चरणों का पालन करेंगे:एक ऐरे ret परिभाषित करेंएक 2D ऐरे v परिभाषित करेंi := 0 से शुरू करें,

  1. C++ में प्रोसेस मारें C++ में प्रोसेस मारें

    मान लीजिए हमारे पास n प्रोसेस हैं, यहां प्रत्येक प्रोसेस की एक अद्वितीय आईडी होती है जिसे PID या प्रोसेस आईडी कहा जाता है और इसका PPID (पैरेंट प्रोसेस आईडी) भी होता है। प्रत्येक प्रोसेस का केवल एक पैरेंट प्रोसेस होता है, लेकिन उसके एक या अधिक चाइल्ड प्रोसेस हो सकते हैं। यह एक ट्री संरचना की तरह है।