C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++での最大長方形


0と1の値が存在する2Dバイナリ行列があるとします。 1のみを含む最大の長方形を見つけて、その面積を返す必要があります。

これを解決するために、次の手順に従います-

  • getAnsという関数を定義します。これは配列a

    を取ります
  • スタックst、i:=0、ans:=0

    を作成します
  • i

    • スタックが空の場合、またはa [i]> =スタックの一番上にある場合は、iをstに挿入し、iを1増やします

    • それ以外の場合-

      • height:=a [スタックの一番上]、スタックから削除

      • width:=スタックが空の場合はi、それ以外の場合はi – stの上部– 1

      • 面積:=高さ*幅

      • ans:=ansと面積の最大値

  • stが空ではない間

    • height:=a [top of st]、スタックから削除

    • width:=stが空の場合のaのサイズ、それ以外の場合のa – stの上部– 1

    • 面積:=高さ*幅

    • ans:=ansと面積の最大値

  • ansを返す

  • メインの方法から、次のようにします-

  • ans:=0、n:=xのサイズ

  • nがゼロの場合、0を返します

  • m:=x [0]

    のサイズ
  • サイズmの配列の高さを1つ作成します

  • 0からn–1の範囲のiの場合

    • 0からm–1の範囲のjの場合

      • 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;
   }
};
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++の長方形エリアII

    (軸に沿った)長方形のリストがあるとします。ここで、各rectangle [i] ={x1、y1、x2、y2}です。ここで、(x1、y1)は左下隅のポイントであり、(x2、y2)は右上隅のポイントです。 i番目の長方形。 平面内のすべての長方形でカバーされる総面積を見つける必要があります。答えは非常に大きい可能性があるため、モジュロ10 ^ 9+7を使用できます。 したがって、入力が次のような場合 その場合、出力は6になります。 これを解決するには、次の手順に従います- m =10 ^ 9 + 7 関数add()を定義します。これには、a、b、が必要です。 r

  2. C++の長方形領域

    2D平面内の2つの直線状の長方形で覆われる総面積を求めたいとします。ここで、各長方形は、図に示すように、左下隅と右上隅によって定義されます。 これを解決するには、次の手順に従います- =HまたはD<=Fの場合、 return(C – A)*(D – B)+(G – E)*(H – F) 配列hを定義し、A、C、E、Gをhに挿入します 配列vを定義し、B、D、F、Hをvに挿入します h配列の並べ替えとv配列の並べ替え temp:=(h [2] – h [1])*(v [2] – v [1]) 合計:=temp 合計:=合計+(C – A