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

C++ में गैर-शून्य सबमैट्रिस की संख्या का पता लगाने का कार्यक्रम

मान लीजिए हमें एक मैट्रिक्स दिया गया है जिसमें केवल दो मान हैं; 1s और 0s। हमें दिए गए मैट्रिक्स में सभी 1s वाले सबमैट्रिस की संख्या का पता लगाना है। हम मान को आउटपुट के रूप में प्रिंट करते हैं।

तो, अगर इनपुट पसंद है

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

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

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

  • n :=मैट्रिक्स का आकार
  • m :=मैट्रिक्स का आकार[0]
  • सरणी जोड़ को आकार में परिभाषित करें:n+1 x m+1.
  • इनिशियलाइज़ i :=0 के लिए, जब i करें
  • इनिशियलाइज़ j :=0 के लिए, जब j करें
  • जोड़ें[i + 1, j + 1] + =मैट्रिक्स[i, j]
  • जोड़ें [i + 1, j + 1] + =जोड़ें [i, j + 1]
  • जोड़ें [i + 1, j + 1] + =जोड़ें [i + 1, j]
  • जोड़ें [i + 1, j + 1] - =जोड़ें [i, j]
  • res :=0
  • इनिशियलाइज़ i :=0 के लिए, जब i करें
  • इनिशियलाइज़ j :=0 के लिए, जब j करें
  • यदि आव्यूह नहीं है[i, j] शून्येतर नहीं है, तो −
    • निम्न भाग पर ध्यान न दें, अगले भाग पर जाएं
  • इनिशियलाइज़ k :=1 के लिए, जब k <=(n - i), अपडेट करें (k को 1 से बढ़ाएँ), −
      करें
    • p :=0,
    • q :=m - j;
    • जबकि p <=q, −
        . करें
      • x :=(p + q) / 2
      • a :=k * x
      • cur :=add[i + k, j + x] - add[i, j + x] - add[i + k, j] + add[i, j]
      • यदि वक्र एक के समान है, तो −
        • r :=x
        • p :=x + 1
      • अन्यथा,
        • q :=x - 1
    • यदि r, 0 के समान है, तो −
      • लूप से बाहर आएं
    • रेस:=रेस + आर
  • रिटर्न रेस
  • उदाहरण

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

    #include<bits/stdc++.h>
    using namespace std;
    
    int solve(vector<vector<int>>& matrix) {
       int n = matrix.size();
       int m = matrix[0].size();
       int add[n + 1][m + 1];
       memset(add, 0, sizeof(add));
    
       for (int i = 0; i < n; i++) {
          for (int j = 0; j < m; j++) {
             add[i + 1][j + 1] += matrix[i][j];
             add[i + 1][j + 1] += add[i][j + 1];
             add[i + 1][j + 1] += add[i + 1][j];
             add[i + 1][j + 1] -= add[i][j];
          }
       }
       int res = 0;
       for (int i = 0; i < n; i++) {
          for (int j = 0; j < m; j++) {
             if (!matrix[i][j])
                continue;
             for (int k = 1; k <= (n - i); k++) {
                int p = 0,
                   q = m - j;
                int r;
                while (p <= q) {
                   int x = (p + q) / 2;
                   int a = k * x;
                   int cur = add[i + k][j + x] - add[i][j + x] - add[i + k][j] + add[i][j];
                   if (cur == a) {
                      r = x;
                      p = x + 1;
                   } else
                      q = x - 1;
                }
                if (r == 0)
                   break;
                res += r;
                }
          }
       }
       return res;
    }
    int main() {
       vector<vector<int>> mat = {{0, 0, 1, 0}, {0, 1, 0, 0}, {0, 1, 0, 1}, {1, 1, 0, 1}};
    cout<< solve(mat) <<endl;
    return 0;
    }

    इनपुट

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

    आउटपुट

    12

    1. C++ प्रोग्राम एक ग्रिड में प्रबुद्ध कोशिकाओं की संख्या का पता लगाने के लिए

      मान लीजिए, हमें h * w आयामों का एक ग्रिड दिया गया है। ग्रिड में कोशिकाओं में या तो बल्ब या बाधाएं हो सकती हैं। एक लाइट बल्ब सेल स्वयं को और उसके दाएं, बाएं, ऊपर और नीचे की कोशिकाओं को रोशन करता है और प्रकाश कोशिकाओं के माध्यम से चमक सकता है जब तक कि कोई बाधा सेल प्रकाश को अवरुद्ध न करे। एक बाधा सेल

    1. C++ प्रोग्राम दिए गए ग्राफ़ में ब्रिज किनारों की संख्या का पता लगाने के लिए

      मान लीजिए, हमें एक अभारित, अप्रत्यक्ष ग्राफ दिया गया है जिसमें n कोने और m किनारे हैं। ग्राफ़ में ब्रिज का किनारा वह किनारा होता है जिसके हटाने से ग्राफ़ डिस्कनेक्ट हो जाता है। हमें दिए गए आलेख में ऐसे आलेखों की संख्या ज्ञात करनी है। ग्राफ़ में समानांतर किनारे या सेल्फ़-लूप नहीं होते हैं। इसलिए, यद

    1. पथ बनाने के लिए ग्रिड में ब्लॉक करने के लिए कोशिकाओं की संख्या का पता लगाने के लिए सी ++ प्रोग्राम

      मान लीजिए, h * w आयामों का एक ग्रिड है। सेल स्थिति (0, 0) में एक रोबोट है और उसे स्थिति (h-1, w-1) पर जाना है। एक ग्रिड में दो प्रकार के सेल होते हैं, ब्लॉक और अनब्लॉक। रोबोट अनब्लॉक की गई कोशिकाओं से गुजर सकता है लेकिन अवरुद्ध कोशिकाओं से नहीं गुजर सकता। रोबोट चार दिशाओं में जा सकता है; यह बाएँ, दा