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

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

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

इसलिए यदि दिया गया इनपुट [[0,0], [0,1]] जैसा है, तो परिवर्तन इस तरह होगा -

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

तो हमें 3 चरणों की आवश्यकता है, आउटपुट 3 होगा।

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

  • n :=पंक्तियों की संख्या, m :=स्तंभों की संख्या, x :=0
  • इनिशियलाइज़ i :=0 के लिए, जब i करें
  • इनिशियलाइज़ j :=0 के लिए, जब j करें
  • इनिशियलाइज़ j :=0 के लिए, जब j करें
  • x :=x + लेफ्ट शिफ्ट मैट[i][j] मान (i * m) + j) कई बार
  • एक सरणी डीपी को 2^(n * m) कोशिकाओं के साथ परिभाषित करें, इसे -1 से भरें
  • dp[x] :=0
  • एक कतार q परिभाषित करें
  • q में x डालें
  • जबकि (q खाली नहीं है), करें −
  • वर्तमान:=q का पहला तत्व, q से तत्व हटाएं
  • यदि धारा 0 के समान है, तो −
    • रिटर्न डीपी[वर्तमान]
  • इनिशियलाइज़ i :=0 के लिए, जब i करें
  • इनिशियलाइज़ j :=0 के लिए, जब j करें
  • अस्थायी:=वर्तमान
  • अस्थायी:=अस्थायी XOR 2^ (i * m) + j)
  • इनिशियलाइज़ k :=0 के लिए, जब k <4, अपडेट करें (k को 1 से बढ़ाएँ), −
      करें
    • ni:=i + dir[k][0]
    • nj :=j + dir[k][1]
    • यदि ni <0 या nj <0 या ni>=n या nj>=m, तो −
      • निम्न भाग पर ध्यान न दें, अगले भाग पर जाएं
      • अस्थायी:=अस्थायी XOR 2^ (नी * एम) + एनजे)
  • यदि dp[temp] -1 के समान है, तो −
    • dp[temp] :=dp[current] + 1
    • अस्थायी को q में डालें
  • वापसी -1
  • आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

    उदाहरण

    #include <bits/stdc++.h>
    using namespace std;
    int dir[4][2] = {{1, 0}, {-1, 0}, {0, -1}, {0, 1}};
    class Solution {
    public:
       int minFlips(vector<vector<int>>& mat) {
          int n = mat.size();
          int m = mat[0].size();
          int x = 0;
          for(int i = 0; i < n; i++){
             for(int j = 0; j < m; j++){
                x += (mat[i][j] << ((i * m) + j));
             }
          }
          vector < int > dp(1 << (n*m), -1);
          dp[x] = 0;
          queue <int> q;
          q.push(x);
          while(!q.empty()){
             int current = q.front();
             q.pop();
             if(current == 0)return dp[current];
             for(int i = 0; i < n; i++){
                for(int j = 0; j < m; j++){
                   int temp = current;
                   temp ^= (1 << ((i *m) + j));
                   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 >= n || nj >= m)continue;
                      temp ^= (1 << ((ni *m) + nj));
                   }
                   if(dp[temp] == -1){
                      dp[temp] = dp[current] + 1;
                      q.push(temp);
                   }
                }
             }
          }
          return -1;
       }
    };
    main(){
       Solution ob;
       vector<vector<int>> v = {{0,0},{0,1}};
       cout << (ob.minFlips(v));
    }

    इनपुट

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

    आउटपुट

    3

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

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

    1. C++ में किसी संख्या को हेक्साडेसिमल में बदलें

      मान लीजिए कि हमारे पास एक पूर्णांक है; हमें इसे हेक्साडेसिमल में बदलने के लिए एक एल्गोरिदम तैयार करना होगा। ऋणात्मक संख्याओं के लिए हम दोनों की पूरक विधि का उपयोग करेंगे। इसलिए, यदि इनपुट 254 और -12 की तरह है, तो आउटपुट क्रमशः fe और fffffff4 होगा। इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

    1. C++ में बाइनरी ट्री की न्यूनतम गहराई

      मान लीजिए हमारे पास एक बाइनरी ट्री है; हमें उस वृक्ष की न्यूनतम गहराई ज्ञात करनी है। जैसा कि हम जानते हैं कि न्यूनतम गहराई रूट नोड से निकटतम लीफ नोड तक सबसे छोटे पथ के साथ नोड्स की संख्या है। तो, अगर इनपुट पसंद है तो आउटपुट 2 . होगा इसे हल करने के लिए, हम इन चरणों का पालन करेंगे - ट्री नोड्स