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

C++ में 01 मैट्रिक्स


मान लीजिए हमारे पास 0 और 1 से बना एक मैट्रिक्स है, हमें प्रत्येक सेल के लिए निकटतम 0 की दूरी ज्ञात करनी है। यहां दो आसन्न सेल के बीच की दूरी 1 है।

उदाहरण के लिए, यदि इनपुट मैट्रिक्स है:

000
010
111

तो आउटपुट होगा:

000
010
121

हल करने की विधि

हम BFS (ब्रेडथ-फर्स्ट सर्च) का उपयोग करेंगे:

  • दिशाओं के लिए एक सरणी dir परिभाषित करें: {{1,0}, {-1,0}, {0,-1}, {0,1}}।
  • पंक्तियों और स्तंभों की संख्या n, m लें।
  • परिणाम मैट्रिक्स ret को अनंत से भरें।
  • एक कतार q परिभाषित करें।
  • मैट्रिक्स को पार करें: यदि सेल 0 है, तो ret में 0 सेट करें और कतार में डालें।
  • स्तर दर स्तर BFS चलाएं: कतार से सेल निकालें, उसके पड़ोसियों की जांच करें, यदि वे सीमा के भीतर हैं और उनकी दूरी वर्तमान स्तर से अधिक है, तो दूरी अपडेट करें और कतार में डालें।
  • ret लौटाएं।

उदाहरण

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

#include <bits/stdc++.h> using namespace std; void print_vector(vector<vector<auto> > v){    cout << "[";    for(int i = 0; i<v.size(); i++){       cout << "[";       for(int j = 0; j <v[i].size(); j++){          cout << v[i][j] << ", ";       }       cout << "],";    }    cout << "]"<<endl; } int dir[4][2] = {{1, 0}, {-1, 0}, {0, -1}, {0, 1}}; class Solution { public:    vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {    int n = matrix.size();    int m = matrix[0].size();    vector < vector <int> > ret(n, vector <int>(m, INT_MAX));    queue < pair <int, int> > q;    for(int i = 0; i < n; i++){       for(int j = 0; j < m; j++){          if(!matrix[i][j]){             ret[i][j] = 0;             q.push({i, j});          }       }    }    for(int lvl = 1; !q.empty(); lvl++){       int sz = q.size();       while(sz--){          pair <int, int> curr = q.front();          q.pop();          for(int k = 0; k < 4; k++){             int nx = curr.first + dir[k][0];             int ny = curr.second + dir[k][1];             if(nx < 0 || nx >= n || ny < 0 || ny >= m || ret[nx][ny] < lvl) continue;                ret[nx][ny] = lvl;                q.push({nx, ny});             }          }       }       return ret;    } }; main(){    Solution ob;    vector<vector<int>> v = {{0,0,0},{0,1,0},{1,1,1}};    print_vector(ob.updateMatrix(v)); }

इनपुट

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

आउटपुट

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

  1. C++ में मैट्रिक्स का जिगजैग (या विकर्ण) ट्रैवर्सल C++ में मैट्रिक्स का जिगजैग (या विकर्ण) ट्रैवर्सल

    इस समस्या में, हमें एक 2D मैट्रिक्स दिया गया है। हमारा कार्य मैट्रिक्स के सभी तत्वों को विकर्ण क्रम में प्रिंट करना है। समस्या को समझने के लिए एक उदाहरण लेते हैं, 1 2 3 4 5 6 7 8 9 आउटपुट - 1 4 2 7 5 3 8 6 9 आइए उस पैटर्न को देखें जो मैट्रिक्स को जिगजैग या विकर्ण रूप में प्रिंट

  1. C++ में स्पाइरल मैट्रिक्स III (Spiral Matrix III) C++ में स्पाइरल मैट्रिक्स III (Spiral Matrix III)

    मान लीजिए हमारे पास R पंक्तियों और C स्तंभों वाला एक 2-आयामी ग्रिड है, हम (r0, c0) से शुरू करते हैं और पूर्व की ओर मुख किए होते हैं। यहां, ग्रिड का उत्तर-पश्चिम कोना पहली पंक्ति और स्तंभ पर है, और दक्षिण-पूर्व कोना अंतिम पंक्ति और स्तंभ पर है। हम इस ग्रिड में हर स्थिति को देखने के लिए दक्षिणावर्त स

  1. C++ में इडेम्पोटेंट मैट्रिक्स जांचें C++ में इडेम्पोटेंट मैट्रिक्स जांचें

    एक मैट्रिक्स M[r][c] दिया गया है, r पंक्तियों की संख्या दर्शाता है और c कॉलम की संख्या दर्शाता है जैसे कि r = c एक स्क्वायर मैट्रिक्स बनाता है। हमें जांचना है कि दिया गया स्क्वायर मैट्रिक्स इडेम्पोटेंट मैट्रिक्स है या नहीं।इडेम्पोटेंट मैट्रिक्सएक मैट्रिक्स M को इडेम्पोटेंट मैट्रिक्स कहा जाता है यदि