C++でのラインリフレクション
2D平面上にn個の点があるとすると、指定された点を対称的に反射するy軸に平行な線があるかどうかを確認する必要があります。つまり、指定された線上にすべての点を反映した後に線が存在するかどうかを確認する必要があります。元のポイントのセットは、反映されたポイントと同じです。
したがって、入力がpoints =[[1,1]、[-1,1]]
のような場合
その場合、出力はtrueになります
これを解決するには、次の手順に従います-
-
1つのセットを定義します。
-
n:=ポイントのサイズ
-
minVal:=inf
-
maxVal:=-inf
-
初期化i:=0の場合、i
-
minVal:=最小のminValとpoints [i、0]
-
maxVal:=maxValとpointsの最大値[i、0]
-
points[i]をokに挿入
-
-
mid:=maxVal + minVal
-
初期化i:=0の場合、i
-
x:=points [i、0]
-
y:=points [i、1]
-
x:=mid-x
-
{x、y}が正常でない場合、-
-
falseを返す
-
-
-
trueを返す
例
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h> using namespace std; class Solution { public: bool isReflected(vector<vector<int<>& points) { set<vector<int< > ok; int n = points.size(); int minVal = INT_MAX; int maxVal = INT_MIN; for (int i = 0; i < n; i++) { minVal = min(minVal, points[i][0]); maxVal = max(maxVal, points[i][0]); ok.insert(points[i]); } int mid = maxVal + minVal; for (int i = 0; i < n; i++) { int x = points[i][0]; int y = points[i][1]; x = mid - x; if (!ok.count({ x, y })) return false; } return true; } }; main(){ Solution ob; vector<vector<int<> v = {{1,1},{-1,1}}; cout << (ob.isReflected(v)); }
入力
{{1,1},{-1,1}}
出力
1
-
C++でのミラーリフレクション
4つの壁のそれぞれに鏡のある特別な正方形の部屋があるとします。南西の角を除く各角に受容体があります。これらには0、1、2の番号が付けられています。正方形の部屋には長さpの壁があり、南西の角からのレーザー光線が最初に0番目の受容体から距離qで東の壁に当たります。光線が最初に出会う受容体の数を見つける必要があります。 したがって、p =2、q =1の場合、ケースは次のようになります- したがって、光線が最初に反射して左壁に戻るときに、光線が受容体2に出会うため、出力は2になります。 これを解決するには、次の手順に従います- pとqはどちらも偶数ですが、 p:=p / 2 q:
-
C++で線が円に接触または交差するかどうかを確認します
円と別の直線があるとします。私たちの仕事は、線が円に接しているか交差しているかを見つけることです。そうでない場合は、線が外側を通過します。したがって、以下のような3つの異なるケースがあります- ここでは、次の手順で解決します。これらは以下のようなものです- 中心と与えられた線の間の垂線Pを見つけます Pを半径r−と比較します rの場合、外部 P =rの場合、タッチします それ以外の場合は内部 垂直距離を取得するには、次の式を使用する必要があります(中心点は(h、k)) $$ \ frac {ah + bk + c} {\ sqrt {a ^ 2 + b ^ 2}} $$