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

सी ++ में बाइनरी मैट्रिक्स को शून्य मैट्रिक्स में बदलने के लिए संचालन की संख्या की गणना करने का कार्यक्रम

मान लीजिए कि हमारे पास एक बाइनरी मैट्रिक्स है। अब एक ऑपरेशन पर विचार करें जहां हम एक सेल लेते हैं और इसे और उसके सभी पड़ोसी कोशिकाओं (ऊपर, नीचे, बाएं, दाएं) को फ्लिप करते हैं। हमें आवश्यक संक्रियाओं की न्यूनतम संख्या ज्ञात करनी होगी जैसे कि मैट्रिक्स में केवल 0s हों। अगर कोई समाधान नहीं है, तो -1 लौटें।

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

0
0
1
0

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

सी ++ में बाइनरी मैट्रिक्स को शून्य मैट्रिक्स में बदलने के लिए संचालन की संख्या की गणना करने का कार्यक्रम

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

  • आकार की एक सरणी dir परिभाषित करें:4 x 2 :={{1, 0}, {0, 1}, { - 1, 0}, {0, - 1}}
  • const int inf =10^6
  • एक फ़ंक्शन को परिभाषित करें getPos(), इसमें i, j,
  • लगेगा
  • रिटर्न आई * सी + जे
  • एक फ़ंक्शन को परिभाषित करें getCoord () इसमें x लगेगा
    • एक जोड़ी रिट परिभाषित करें
    • ret[0] :=x / c
    • ret[1] :=x mod c
    • रिटर्न रिटर्न
  • मुख्य विधि से निम्न कार्य करें:
  • मुखौटा:=0
  • r :=मैट्रिक्स की पंक्ति गणना
  • c :=मैट्रिक्स की कॉलम संख्या
  • अंतिम:=r * c
  • इनिशियलाइज़ i :=0 के लिए, जब i
  • इनिशियलाइज़ j :=0 के लिए, जब j
  • मास्क:=मास्क XOR (मैट्रिक्स[i, j] * 2^getPos(i, j))
  • आकार 512 के एक सरणी जिले को परिभाषित करें और -1 से भरें
  • एक कतार q परिभाषित करें
  • क्यू में मास्क डालें
  • जिला[मास्क] :=0
  • जबकि (क्यू खाली नहीं है), करें:
    • मुखौटा:=q का पहला तत्व
    • q से तत्व हटाएं
    • इनिशियलाइज़ i :=0 के लिए, जब i <आखिरी, अपडेट (i 1 से बढ़ाएँ), करें:
      • एक जोड़ी समन्वय परिभाषित करें
      • x :=कोर्ड[0]
      • y:=कोर्ड[1]
      • मुखौटा:=मुखौटा
      • nmask :=nmask XOR 2^i
      • इनिशियलाइज़ k :=0 के लिए, जब k <4, अपडेट करें (k 1 से बढ़ाएँ), करें:
        • nx :=x + dir[k, 0]
        • ny:=y + dir[k, 1]
        • यदि nx और ny मैट्रिक्स की सीमा में नहीं हैं, तो:
          • निम्न भाग पर ध्यान न दें, अगले भाग पर जाएं
        • स्थिति:=getPos(nx, ny)
        • nmask :=nmask XOR (2^pos)
      • यदि डिस्ट[nmask] -1 या dist[nmask]> dist[mask] + 1 के समान है, तो:
        • dist[nmask] :=dist[mask] + 1
        • q में nmask डालें
  • वापसी जिला[0]
  • आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

    उदाहरण

    #include
    using namespace std;
    int dir[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
    int c;
    int r;
    int last;
    const int inf = 1e6;
    
    int getPos(int i, int j){
       return i * c + j;
    }
    pair getCoord(int x){
       pair ret;
       ret.first = x / c;
       ret.second = x % c;
       return ret;
    }
    
    int solve(vector>& matrix) {
       int mask = 0;
       r = matrix.size();
       c = r ? matrix[0].size() : 0;
       last = r * c;
       for(int i = 0; i < r; i++){
          for(int j = 0; j < c; j++){
             mask ^= (matrix[i][j] << getPos(i, j));
          }
       }
       vector dist(1 << 9, -1);
       queue q;
       q.push(mask);
       dist[mask] = 0;
       while(!q.empty()){
          mask = q.front();
          q.pop();
         
          for(int i = 0; i < last; i++){
             pair coord = getCoord(i);      
             int x = coord.first;
             int y = coord.second;
             
             int nmask = mask ;
             nmask ^= (1 << i);
             for(int k = 0; k < 4; k++){
                int nx = x + dir[k][0];
                int ny = y + dir[k][1];
                if(nx < 0 || nx >= r || ny < 0 || ny >= c)
                   continue;
                int pos = getPos(nx, ny);
                nmask ^= (1 << pos);
             }
             
             if(dist[nmask] == -1 || dist[nmask] > dist[mask] + 1){
                dist[nmask] = dist[mask] + 1;
                q.push(nmask);
             }
          }
       }
       return dist[0];
    }
    int main(){
       vector> v = {{0, 0},{1, 0}};
       cout << solve(v);
    }

    इनपुट

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

    आउटपुट

    3

    1. C++ में दिए गए मैट्रिक्स में 1s के वर्ग सबमैटिक्स की संख्या गिनने का कार्यक्रम

      मान लीजिए कि हमारे पास 2d बाइनरी मैट्रिक्स है, हमें सभी 1 s के साथ सबमैट्रिस की कुल संख्या ज्ञात करनी है। तो, अगर इनपुट पसंद है 1 1 0 1 1 0 0 0 1 तो आउटपुट 10 होगा, क्योंकि वहां पांच 1 x 1 मैट्रिक्स, दो 2 x 1 मैट्रिक्स है। दो 1 x 2 मैट्रिक्स। और एक 2 x 2 मैट्रिक्स। इसे हल करने के लिए, हम इन

    1. C++ में मान्य त्रिभुज त्रिक की संख्या गिनने का कार्यक्रम

      मान लीजिए कि हमारे पास संख्याओं की एक सरणी है, हमें उस सरणी से चुने गए त्रिकों की संख्या ज्ञात करनी है जो त्रिभुज बना सकते हैं यदि हम उन्हें त्रिभुज की भुजाओं की लंबाई के रूप में लेते हैं। तो अगर इनपुट [2,2,3,4] जैसा है, तो परिणाम 3 होगा क्योंकि पहले 2 का उपयोग करते हुए तीन ट्रिपल [2,3,4] हैं, [2,3,

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

      मान लीजिए हमारे पास एक m x n बाइनरी मैट्रिक्स मैट है। एक चरण में, हम एक सेल चुन सकते हैं और उसके बिट को फ्लिप कर सकते हैं और यदि वे मौजूद हैं तो उसके चारों पड़ोसी। हमें मैट को शून्य मैट्रिक्स में बदलने के लिए आवश्यक न्यूनतम चरणों की संख्या ज्ञात करनी होगी। अगर कोई समाधान नहीं है, तो -1 लौटें। इसलिए