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

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


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

समाधान दृष्टिकोण

  1. दिशा ऐरे dirr := [[0,1],[1,0],[0,-1],[-1,0]]

  2. ret मैट्रिक्स, len := 0, dir := 0 बनाएं

  3. (r0, c0) को ret में डालें

  4. जब तक ret का आकार < R*C:

  5. यदि dir = 0 या 2 तो len++

  6. len चरणों के लिए: r0, c0 अपडेट करें, यदि ग्रिड में है तो ret में जोड़ें

  7. dir = (dir+1)%4 अपडेट करें

  8. ret लौटाएं

C++ कार्यान्वयन

#include <bits/stdc++.h> 
using namespace std; 

void print_vector(vector<vector<int>> 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 dirr[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; 

class Solution { 
public: 
    vector<vector<int>> spiralMatrixIII(int R, int C, int r0, int c0) { 
        vector<vector<int>> ret; 
        int len = 0; 
        int dir = 0; 
        ret.push_back({r0, c0}); 
        while(ret.size() < R * C){ 
            if(dir == 0 || dir == 2) len++; 
            for(int i = 0; i < len; i++){ 
                r0 = r0 + dirr[dir][0]; 
                c0 = c0 + dirr[dir][1]; 
                if(r0 < 0 || c0 < 0 || c0 >= C || r0 >= R) continue; 
                ret.push_back({r0, c0}); 
            } 
            dir = (dir + 1) % 4; 
        } 
        return ret; 
    } 
}; 

int main(){ 
    Solution ob; 
    print_vector(ob.spiralMatrixIII(5,5,1,3)); 
    return 0; 
}

इनपुट

5 5 1 3

आउटपुट

[[1,3],[1,4],[2,4],[2,3],[2,2],[1,2],[0,2],[0,3],[0,4],[3,4],[3,3],[3,2],[3,1],[2,1],[1,1],[0,1],[4,4],[4,3],[4,2],[4,1],[4,0],[3,0],[2,0],[1,0],[0,0]]
  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 C++ में बल्ब स्विचर III

    मान लीजिए हमारे पास n बल्ब्स वाला एक कमरा है, ये 1 से n तक नंबरेड हैं, बाएं से दाएं एक पंक्ति में व्यवस्थित। प्रारंभ में, सभी बल्ब्स बंद हैं। मोमेंट k पर (k के लिए 0 से n-1 की रेंज में), हम light[k] बल्ब को ऑन करते हैं। एक बल्ब केवल तभी नीला होता है जब वह ऑन हो और उसके सभी पिछले बल्ब (बाएं तरफ) भी

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

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