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

सी++ में एन्क्लेव की संख्या

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

0 0 0 0
1 0 1 0
0 1 1 0
0 0 0 0

उत्तर 3 होगा, क्योंकि तीन 0 से संलग्न हैं, और एक 1 संलग्न नहीं है।

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • एक दिशा सरणी बनाएं, और स्टोर करें [[1,0], [-1,0], [0,1], [0,-1]]

  • dfs() नामक एक विधि बनाएं, इसमें x, y और मैट्रिक्स A लगेगा

  • यदि x <0 या y> 0 या x> A की पंक्ति संख्या या y> A की स्तंभ संख्या, या A[x, y] 0 है, तो वापस लौटें

  • सेट ए [एक्स, वाई]:=0

  • कश्मीर के लिए 0 से 3 की सीमा में

    • एनएक्स:=डीआईआर [के, 0] + एक्स, एनवाई:=डीआईआर [के, 1] + वाई

    • डीएफएस (एनएक्स, एनवाई, ए)

  • मुख्य विधि से निम्न कार्य करें

  • ret :=0, n :=A की पंक्ति गणना

  • m :=A की कॉलम संख्या यदि n 0 नहीं है, अन्यथा m :=0

  • मेरे लिए 0 से n - 1 की सीमा में

    • अगर A[i, 0] =1, तो dfs(i, 0, A) पर कॉल करें

    • अगर A[i, m-1] 1 है, तो dfs(i, m-1, A) पर कॉल करें

  • मेरे लिए 0 से मी - 1 की सीमा में

    • अगर A[0, i] =1, तो dfs(0, i, A) पर कॉल करें

    • अगर A[n-1, i] 1 है, तो dfs(n-1, i, A) पर कॉल करें

  • मेरे लिए 0 से n - 1 की सीमा में

    • j के लिए 0 से m - 1 की सीमा में

      • रिट:=रिट + ए[i, j]

  • वापसी रिट

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

उदाहरण

#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;
   }
};
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));
}

इनपुट

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

आउटपुट

3

  1. C++ में मितव्ययी संख्या

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

  1. सी++ पेंटाटोप नंबर

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

  1. C++ में एडम नंबर

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