C++で2点間の最短距離を見つけるプログラム
各要素が[x、y]の形式であり、ユークリッド座標を表す座標のリストがあるとします。最小の二乗距離(x 1 )を見つける必要があります -x 2 ) 2 +(y 1 -y 2 ) 2 提供された任意の2つの座標間。
したがって、入力が座標={{1、2}、{1、4}、{3、5}}のような場合、出力は4になります。
これを解決するには、次の手順に従います-
-
1つのマップを定義しますytorightmostx
-
配列座標を並べ替える
-
ret:=無限大
-
座標の各pについて-
-
it =(p [1] --sqrt(ret))がytorightmostxにある値、またはytorightmostxからのそれよりも大きい最小値を返します
-
ytorightmostxの最後の要素と等しくありませんが、-
を実行します。-
yd:=最初-そのp[1]
-
yd>0かつyd*yd> =retの場合、-
-
ループから出てきます
-
-
nxt =it
-
nxtを1増やします
-
ret:=最小値(ret、dist(p [0]、p [1]、最初の値、2番目の値)
-
xd:=その2番目の値-p [0]
-
xd * xd> =retの場合、-
-
ytorightmostxから削除します
-
-
it:=nxt
-
-
ytorightmostx [p [1]]:=p [0]
-
-
retを返す
-
関数dist()を定義します。これには、xl、yl、xr、yrが必要です。
-
xd:=xl --xr
-
yd:=yl --yr
-
xd * xd + yd*ydを返す
-
例
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h>
using namespace std;
long long dist(long long xl, long long yl, long long xr, long long yr) {
long long xd = xl - xr;
long long yd = yl - yr;
return xd * xd + yd * yd;
}
int solve(vector<vector<int>>& coordinates) {
map<long long, long long> ytorightmostx;
sort(coordinates.begin(), coordinates.end());
long long ret = 1e18;
for (auto& p : coordinates) {
auto it = ytorightmostx.lower_bound(p[1] - sqrt(ret));
while (it != ytorightmostx.end()) {
long long yd = it->first - p[1];
if (yd > 0 && yd * yd >= ret) {
break;
}
auto nxt = it;
nxt++;
ret = min(ret, dist(p[0], p[1], it->second, it->first));
long long xd = (it->second - p[0]);
if (xd * xd >= ret) {
ytorightmostx.erase(it);
}
it = nxt;
}
ytorightmostx[p[1]] = p[0];
}
return ret;
}
int main(){
vector<vector<int>> coord = {{1, 2},{1, 4},{3, 5}};
cout << solve(coord) << endl;
return 0;
} 入力
{{1, 2},{1, 4},{3, 5}} 出力
4
-
C++で平行四辺形の面積を見つけるプログラム
この問題では、平行四辺形の底と高さを表す2つの値が与えられます。私たちのタスクは、C++で平行四辺形の領域を見つけるプログラムを作成することです。 平行四辺形 は、反対側が等しく平行な4辺の閉じた図形です。 問題を理解するために例を見てみましょう 入力 B = 20, H = 15 出力 300 説明 平行四辺形の面積=B* H =20 * 15 =300 ソリューションアプローチ この問題を解決するために、平行四辺形の面積の幾何学的公式を使用します。 Area = base * height. ソリューションの動作を説明するプログラム 例 #include <io
-
C++で二分木の2つのノード間の距離を見つける
ノードが少ない二分木があると考えてください。 2つのノードuとvの間の距離を見つける必要があります。ツリーが次のようになっていると仮定します- これで、(4、6)=4の間の距離、パスの長さは4、(5、8)の間の長さ=5などになります。 この問題を解決するために、LCA(Lowest Common Ancestor)を見つけてから、LCAから2つのノードまでの距離を計算します。 例 #include<iostream> using namespace std; class Node { public: in