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

C++ में एन्क्लेव्स की संख्या (Number of Enclaves)


मान लीजिए हमें एक 2D ऐरे A दिया गया है, जहां प्रत्येक सेल 0 (समुद्र दर्शाता है) या 1 (भूमि दर्शाता है) है। यहां एक चाल में एक भूमि वर्ग से 4-दिशात्मक रूप से दूसरे भूमि वर्ग पर चलना, या ग्रिड की सीमा से बाहर निकलना शामिल है। हमें ग्रिड में उन भूमि वर्गों की संख्या खोजनी है जिनसे हम किसी भी संख्या में चालों में ग्रिड की सीमा से बाहर नहीं निकल सकते।

उदाहरण के लिए, यदि ग्रिड है:

0000
1010
0110
0000
उत्तर 3 होगा, क्योंकि तीन 1s 0s से घिरे हुए हैं, और एक 1 घिरा हुआ नहीं है।

समाधान दृष्टिकोण

  1. दिशा ऐरे dir := [[1,0], [-1,0], [0,1], [0,-1]] बनाएं

  2. dfs() विधि बनाएं जो x, y और मैट्रिक्स A लेती है

  3. सीमा पर स्थित सभी भूमि सेल्स से DFS चलाकर उन्हें 0 में बदलें

  4. शेष बचे 1s की गिनती करें - वही एन्क्लेव्स हैं

C++ कार्यान्वयन

#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>>& A){ 
        if(x < 0 || y < 0 || x >= A.size() || y >= A[0].size() || A[x][y] == 0) return; 
        A[x][y] = 0; 
        for(int k = 0; k < 4; k++){ 
            int nx = dir[k][0] + x; 
            int ny = dir[k][1] + y; 
            dfs(nx, ny, A); 
        } 
    } 
    
    int numEnclaves(vector<vector<int>>& A) { 
        int ret = 0; 
        int n = A.size(); 
        int m = n ? A[0].size() : 0; 
        for(int i = 0; i < n; i++){ 
            if(A[i][0] == 1) dfs(i, 0, A); 
            if(A[i][m - 1] == 1) dfs(i, m - 1, A); 
        } 
        for(int i = 0; i < m; i++){ 
            if(A[0][i] == 1) dfs(0, i, A); 
            if(A[n - 1][i] == 1) dfs(n - 1, i, A); 
        } 
        for(int i = 0; i < n; i++){ 
            for(int j = 0; j < m; j++){ 
                ret += A[i][j]; 
            } 
        } 
        return ret; 
    } 
}; 

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

इनपुट

[[0,0,0,0],[1,0,1,0],[0,1,1,0],[0,0,0,0]]

आउटपुट

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

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

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

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

  1. - C++ में एडम नंबर जांचना

    इस खंड में हम देखेंगे कि दी गई संख्या एडम नंबर है या नहीं, इसकी जांच करने वाला प्रोग्राम कैसे लिखें। कोड में जाने से पहले देखते हैं कि एडम नंबर क्या है? एडम नंबर वह संख्या है, मान लीजिए n, यदि n का वर्ग और n के रिवर्स का वर्ग एक-दूसरे के रिवर्स हैं, तो वह संख्या एडम नंबर है। उदाहरण के लिए संख्या 13