C++でのライン上の最大ポイント
2D平面があるとします。同じ直線上にある点の最大数を見つける必要があります。したがって、ポイントが次のような場合-
それから4つのポイントがあります
これを解決するには、次の手順に従います-
-
n:=ポイントの数、n <3の場合、n
を返します -
ans:=2
-
1からn–1の範囲のiの場合
-
カウント:=0
-
インデックスiとi– 1から2つのポイントを取ります。これらは、p1、p2
です。 -
p1ポイントとp2ポイントが同じ場合、
-
0からn–1の範囲のjの場合
-
points [j] .x=p1.xおよびpoints[j].y =p1.yの場合、カウントを1増やします
-
-
-
それ以外の場合-
-
0からn–1の範囲のjの場合
-
p3:=インデックスjからのポイント
-
p3.y – p2.y * p2.x – p1.x =p2.y – p1.y * p3.x – p2.xの場合、カウントを1増やします
-
-
-
ans:=ansとカウントの最大値
-
-
ansを返す
例
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
class Solution {
public:
int maxPoints(vector<vector<int>>& points) {
int n = points.size();
if(n<3)return n;
int ans = 2;
for(int i = 1;i<n;i++){
int count = 0;
lli x1 = points[i-1][0];
lli x2 = points[i][0];
lli y1 = points[i-1][1];
lli y2 = points[i][1];
if(x1 == x2 && y1 == y2){
for(int j =0;j<n;j++){
if(points[j][0] ==x1 && points[j][1] == y1)count++;
}
} else {
for(int j =0;j<n;j++){
int x3 = points[j][0];
int y3 = points[j][1];
if((y3-y2)*(x2-x1) == (y2-y1)*(x3-x2))count++ ;
}
}
ans = max(ans, count);
}
return ans;
}
};
main(){
Solution ob;
vector<vector<int>> v = {{1,1},{3,2},{5,3},{4,1},{2,3},{1,4}};
cout << (ob.maxPoints(v));
} 入力
[{1,1},{3,2},{5,3},{4,1},{2,3},{1,5}] 出力
4
-
C++でのラインリフレクション
2D平面上にn個の点があるとすると、指定された点を対称的に反射するy軸に平行な線があるかどうかを確認する必要があります。つまり、指定された線上にすべての点を反映した後に線が存在するかどうかを確認する必要があります。元のポイントのセットは、反映されたポイントと同じです。 したがって、入力がpoints =[[1,1]、[-1,1]]のような場合 その場合、出力はtrueになります これを解決するには、次の手順に従います- 1つのセットを定義します。 n:=ポイントのサイズ minVal:=inf maxVal:=-inf 初期化i:=0の場合、i <
-
C++で線が円に接触または交差するかどうかを確認します
円と別の直線があるとします。私たちの仕事は、線が円に接しているか交差しているかを見つけることです。そうでない場合は、線が外側を通過します。したがって、以下のような3つの異なるケースがあります- ここでは、次の手順で解決します。これらは以下のようなものです- 中心と与えられた線の間の垂線Pを見つけます Pを半径r−と比較します rの場合、外部 P =rの場合、タッチします それ以外の場合は内部 垂直距離を取得するには、次の式を使用する必要があります(中心点は(h、k)) $$ \ frac {ah + bk + c} {\ sqrt {a ^ 2 + b ^ 2}} $$