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

C++での完璧な長方形


N個の軸に沿った長方形があるとすると、それらがすべて一緒になって長方形領域の正確なカバーを形成するかどうかを確認する必要があります。ここでは、各長方形は左下の点と右上の点として表されます。したがって、単位正方形は[1,1,2,2]として表されます。 (左下の点は(1、1)で、右上の点は(2、2)です。)

したがって、入力が長方形のような場合=[[1,1,3,3]、[3,1,4,2]、[3,2,4,4]、[1,3,2,4]、 [2,3,3,4]]の場合、5つの長方形すべてが一緒になって長方形領域の正確なカバーを形成するため、出力はtrueになります。

C++での完璧な長方形

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

  • 訪問した1セットを定義する

  • 面積:=0

  • x2:=-inf、x1:=inf

  • y2:=-inf、y1:=inf

  • 与えられたリストの各rについてre−

    • x1:=r[0]とx1の最小値

    • x2:=r[2]とx2の最大値

    • y1:=r[1]とy1の最小値

    • y2:=r[3]とy2の最大値

    • area:=area +((r [2] --r [0])*(r [3] --r [1]))

    • s1:=r[0]連結r[1]

    • s2:=r[0]連結r[3]

    • s3:=r[2]連結r[3]

    • s4:=r[2]連結r[1]

    • s1にアクセスすると、-

      • 訪問先からs1を削除

    • それ以外の場合

      • s1をvisitedに挿入します

    • s2にアクセスすると、-

      • 訪問済みからs2を削除する

    • それ以外の場合

      • 訪問先にs2を挿入

    • s3にアクセスすると、-

      • 訪問済みからs3を削除する

    • それ以外の場合

      • 訪問先にs3を挿入

    • s4にアクセスすると、-

      • 訪問済みからs4を削除

    • それ以外の場合

      • 訪問先にs4を挿入

  • s1:=x1とy1を連結します

  • s2:=x2とy1を連結する

  • s3:=x1とy2を連結する

  • s4:=x2とy2を連結する

  • s1、s2、s3、s4がすべて訪問されていない場合は、

    • falseを返す

  • 面積が((x2-x1)*(y2-y1))と同じ場合はtrueを返します

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   bool isRectangleCover(vector<vector<int>> &re) {
      unordered_set<string> visited;
      int area = 0;
      int x2 = INT_MIN;
      int x1 = INT_MAX;
      int y2 = INT_MIN;
      int y1 = INT_MAX;
      for (auto &r : re) {
         x1 = min(r[0], x1);
         x2 = max(r[2], x2);
         y1 = min(r[1], y1);
         y2 = max(r[3], y2);
         area += (r[2] - r[0]) * (r[3] - r[1]);
         string s1 = to_string(r[0]) + to_string(r[1]);
         string s2 = to_string(r[0]) + to_string(r[3]);
         string s3 = to_string(r[2]) + to_string(r[3]);
         string s4 = to_string(r[2]) + to_string(r[1]);
         if (visited.count(s1)) {
            visited.erase(s1);
         }
         else
            visited.insert(s1);
         if (visited.count(s2)) {
            visited.erase(s2);
         }
         else
            visited.insert(s2);
         if (visited.count(s3)) {
            visited.erase(s3);
         }
         else
            visited.insert(s3);
         if (visited.count(s4)) {
            visited.erase(s4);
         }
         else
            visited.insert(s4);
         }
         string s1 = to_string(x1) + to_string(y1);
         string s2 = to_string(x2) + to_string(y1);
         string s3 = to_string(x1) + to_string(y2);
         string s4 = to_string(x2) + to_string(y2);
         if (!visited.count(s1) || !visited.count(s2) || !visited.count(s3) || !visited.count(s4) || visited.size() != 4)
            return false;
         return area == (x2 - x1) * (y2 - y1);
      }
};
main() {
   Solution ob;
   vector<vector<int>> v = {{1, 1, 3, 3}, {3, 1, 4, 2}, {3, 2, 4, 4}, {1, 3, 2, 4}, {2, 3, 3, 4}};
   cout << (ob.isRectangleCover(v));
}

入力

{{1, 1, 3, 3}, {3, 1, 4, 2}, {3, 2, 4, 4}, {1, 3, 2, 4}, {2, 3, 3, 4}}

出力

1

  1. C++でバイナリツリーノードを検証する

    0からn-1までの番号が付けられたn個の二分木ノードがあり、ノードIに2つの子leftChild[i]とrightChild[i]があるとすると、次の場合にのみtrueと言う必要があります。指定されたすべてのノードは、正確に1つの有効な二分木を形成します。ノードiに左の子がない場合、leftChild [i]は-1に等しくなります。これは、右の子の場合と同様です。ノードには値がなく、この問題ではノード番号のみを使用することに注意する必要があります。したがって、入力が-のような場合 その後、出力はtrueになります。 これを解決するには、次の手順に従います- dfsというメソッド

  2. C++の中間点を使用して長方形の角を見つける

    長方形ABCDがあると仮定しますが、中点PとQの座標、および長方形Lの長さしかありません。 私たちのタスクは、PとQの座標、および辺Lの長さを使用して、A、B、C、およびDの座標を見つけることです。たとえば、Pが(1、0)、Qが(1、2)の場合、およびLが2の場合、A、B、C、Dはそれぞれ(0、0)、(0、2)、(2、2)になります。 (2、0)。 発生する可能性のあるケースは3つあります。 長方形は水平であるため、ADとBCはX軸に平行です 長方形は垂直であるため、ADとBCはY軸に平行です 長方形は軸に対して特定の角度で傾斜しています。 3番目のケースでは、PとQの座標を使