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