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

सी++ में अधिकतम आयत

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

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

  • getAns नामक एक फ़ंक्शन को परिभाषित करें, यह एक सरणी लेगा

  • स्टैक सेंट बनाएं, i:=0, उत्तर:=0

  • जबकि मैं <आकार a, तब

    • यदि स्टैक खाली है या a[i]>=स्टैक के ऊपर, तो i को st में डालें, i को 1 से बढ़ाएँ

    • अन्यथा -

      • ऊंचाई:=ए [स्टैक का शीर्ष], स्टैक से हटाएं

      • चौड़ाई :=i जब स्टैक खाली हो, अन्यथा i – सेंट के ऊपर – 1

      • क्षेत्र:=ऊंचाई * चौड़ाई

      • उत्तर :=अधिकतम उत्तर और क्षेत्रफल

  • जबकि सेंट खाली नहीं है

    • ऊंचाई:=ए [सेंट का शीर्ष], स्टैक से हटाएं

    • चौड़ाई :=एक का आकार जब सेंट खाली है, अन्यथा ए का आकार – सेंट के शीर्ष – 1

    • क्षेत्र:=ऊंचाई * चौड़ाई

    • उत्तर :=अधिकतम उत्तर और क्षेत्रफल

  • वापसी उत्तर

  • मुख्य विधि से निम्न कार्य करें -

  • उत्तर:=0, एन:=x का आकार

  • अगर n शून्य है, तो वापस 0

  • मी :=x का आकार[0]

  • मी आकार की एक सरणी ऊंचाई बनाएं

  • मेरे लिए 0 से n - 1 की सीमा में

    • j के लिए 0 से m - 1 की सीमा में

      • यदि x[i, j] =1, तो ऊँचाई [j] 1 से बढ़ाएँ, अन्यथा ऊँचाई [j] :=0

    • उत्तर:=अधिकतम उत्तर और प्राप्त उत्तर (ऊंचाई)

  • वापसी उत्तर

उदाहरण (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;
   }
};
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++ में एक आयत में वर्गों की संख्या गिनें

    =B. लक्ष्य उन वर्गों की संख्या का पता लगाना है जिन्हें LXB आकार का एक आयत समायोजित कर सकता है। ऊपर दिया गया चित्र 3 X 2 आकार का एक आयत दिखाता है। इसमें 2, 2X2 वर्ग और 6,1X1 वर्ग हैं। कुल वर्ग=6+2=8. LXB आकार के प्रत्येक आयत में L*B संख्या 1X1 वर्ग होती है। सबसे बड़े वर्ग BXB आकार के होते ह

  1. C++ में आयत क्षेत्र II

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

  1. C++ में आयत क्षेत्र

    मान लीजिए कि हम 2D समतल में दो आयताकार आयतों द्वारा कवर किए गए कुल क्षेत्रफल को ज्ञात करना चाहते हैं। यहाँ प्रत्येक आयत को उसके निचले बाएँ कोने और ऊपरी दाएँ कोने से परिभाषित किया गया है जैसा कि चित्र में दिखाया गया है। इसे हल करने के लिए, हम इन चरणों का पालन करेंगे - =एच या डी <=एफ, तो वापसी