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

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


मान लीजिए हमारे पास एक 2D बाइनरी मैट्रिक्स है जहां 0 और 1 मान मौजूद हैं। हमें केवल 1s वाले सबसे बड़े आयत को ढूंढना है और उसका क्षेत्रफल वापस करना है।

हल करने का दृष्टिकोण

इस समस्या को हल करने के लिए हम निम्नलिखित चरणों का पालन करेंगे:

  • getAns नामक एक फ़ंक्शन परिभाषित करें, जो ऐरे a लेता है।
  • स्टैक st बनाएं, i := 0, ans := 0
  • जब तक i < a का आकार:
    • यदि स्टैक खाली है या a[i] >= स्टैक के शीर्ष, तो i को st में डालें, i को 1 बढ़ाएं
    • अन्यथा:
      • height := a[स्टैक का शीर्ष], स्टैक से हटाएं
      • width := i जब स्टैक खाली हो, अन्यथा i - स्टैक का शीर्ष - 1
      • area := height * width
      • ans := ans और area का अधिकतम
  • जब तक st खाली नहीं है:
    • height := a[st का शीर्ष], स्टैक से हटाएं
    • width := a का आकार जब st खाली हो, अन्यथा a का आकार - st का शीर्ष - 1
    • area := height * width
    • ans := ans और area का अधिकतम
  • ans वापस करें
  • मुख्य विधि से:
    • ans := 0, n := x का आकार
    • यदि n शून्य है, तो 0 वापस करें
    • m := x[0] का आकार
    • आकार m का एक ऐरे height बनाएं
    • i को 0 से n-1 तक लूप चलाएं:
      • j को 0 से m-1 तक लूप चलाएं:
        • यदि x[i][j] == '1', तो height[j] को 1 बढ़ाएं, अन्यथा height[j] := 0
      • ans := ans और getAns(height) का अधिकतम
    • ans वापस करें

उदाहरण (C++ कोड)

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

#include <bits/stdc++.h> 
using namespace std; 
class Solution { 
public: 
    int getAns(vector<int> a){ 
        stack<int> st; 
        int i = 0; 
        int ans = 0; 
        while(i < a.size()){ 
            if(st.empty() || a[i] >= a[st.top()]){ 
                st.push(i); 
                i++; 
            } else { 
                int height = a[st.top()]; 
                st.pop(); 
                int width = st.empty() ? i : i - st.top() - 1; 
                int area = height * width; 
                ans = max(ans, area); 
            } 
        } 
        while(!st.empty()){ 
            int height = a[st.top()]; 
            st.pop(); 
            int width = st.empty() ? a.size() : a.size() - st.top() - 1; 
            int area = height * width; 
            ans = max(ans, area); 
        } 
        return ans; 
    } 
    int maximalRectangle(vector<vector<char>>& x) { 
        int ans = 0; 
        int n = x.size(); 
        if(!n) return 0; 
        int m = x[0].size(); 
        vector<int> height(m); 
        for(int i = 0; i < n; i++){ 
            for(int j = 0; j < m; j++){ 
                if(x[i][j] == '1') height[j]++; 
                else height[j] = 0; 
            } 
            ans = max(ans, getAns(height)); 
        } 
        return ans; 
    } 
}; 
int main(){ 
    vector<vector<char>> v = { 
        {'1','0','1','0','0'}, 
        {'1','0','1','1','1'}, 
        {'1','1','1','1','1'}, 
        {'1','0','0','1','0'} 
    }; 
    Solution ob; 
    cout << (ob.maximalRectangle(v)); 
}

इनपुट

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

आउटपुट

6
  1. C++ में आयत में वर्गों की संख्या गिनना C++ में आयत में वर्गों की संख्या गिनना

    =B। लक्ष्य LxB आकार के आयत में समायोजित किए जा सकने वाले वर्गों की संख्या ढूंढना है। उपरोक्त आकृति 3x2 आकार के एक आयत को दर्शाती है। इसमें 2, 2x2 वर्ग और 6, 1x1 वर्ग हैं। कुल वर्ग = 6+2=8। LxB आकार के हर आयत में L*B संख्या के 1x1 वर्ग होते हैं। सबसे बड़े वर्ग BxB आकार के होते हैं। L=B=1 के लिए, वर

  1. C++ में आयत क्षेत्रफल II (Rectangle Area II) - ओवरलैपिंग आयतों का कुल क्षेत्रफल C++ में आयत क्षेत्रफल II (Rectangle Area II) - ओवरलैपिंग आयतों का कुल क्षेत्रफल

    समस्या विवरण हमें अक्ष-संरेखित (axis-aligned) आयतों की एक सूची दी गई है। प्रत्येक आयत rectangle[i] = {x1, y1, x2, y2} द्वारा दर्शाया गया है, जहां (x1, y1) निचले-बाएं कोने का बिंदु है और (x2, y2) ऊपरी-दाएं कोने का बिंदु है। हमें तल (plane) में सभी आयतों द्वारा कवर किए गए कुल क्षेत्रफल को ज्ञात करना

  1. C++ में आयत क्षेत्रफल गणना C++ में आयत क्षेत्रफल गणना

    मान लीजिए हम 2D तल में दो समकोणीय आयतों द्वारा कवर किए गए कुल क्षेत्रफल को ढूंढना चाहते हैं। प्रत्येक आयत को उसके निचले बाएं कोने और ऊपरी दाएं कोने द्वारा परिभाषित किया जाता है।हल करने के चरण= H या D <= F, तो(C - A) * (D - B) + (G - E) * (H - F) वापस करेंएक सरणी h परिभाषित करें, इसमें A, C, E, G डाल