C++で正N角形上の3人目の最適な位置を求める方法
このチュートリアルでは、正N角形上における3人目の人物の最適な位置を求める方法を解説します。
正N角形が与えられ、すでに2人の人物がそれぞれ異なる頂点に立っているものとします。ここでの課題は、既存の2人から3人目までの距離の合計が最小になるように、3人目を配置すべき頂点を見つけることです。
アルゴリズムの手順
問題を解くための手順は以下の通りです。
- Nと2つの頂点A、Bを初期化します。
- 3人目の位置を格納する変数と、最小合計値を初期化します。
- 1からNまで繰り返し処理を行います。
- 現在の頂点がAまたはBの場合はスキップします。
- 現在の頂点とA、Bとの差の絶対値の合計を計算します。
- その合計を最小合計値と比較します。
- 現在の合計が最小合計値より小さい場合は、位置と最小合計値を更新します。
- 3人目の位置を出力します。
サンプルコード
それでは、実際のコードを見てみましょう。
#include <bits/stdc++.h>
using namespace std;
int findThirdPersonStandingVertex(int N, int A, int B) {
int position = 0;
int minimum_sum = INT_MAX, sum;
for (int i = 1; i <= N; i++) {
// 既に使用されている頂点はスキップ
if (i == A || i == B) {
continue;
}
else {
// 現在の頂点からAおよびBまでの距離
sum = abs(i - A) + abs(i - B);
// 現在の合計がこれまでの最小値より小さいかチェック
if (sum < minimum_sum) {
// 最小合計値と頂点の位置を更新
minimum_sum = sum;
position = i;
}
}
}
return position;
}
int main() {
int N = 7, A = 5, B = 7;
cout << "Vertex: " << findThirdPersonStandingVertex(N, A, B) << endl;
return 0;
}
実行結果
上記のプログラムを実行すると、次のような結果が出力されます。
Vertex: 6
まとめ
このアルゴリズムは、すべての頂点を一度ずつ確認する線形探索(計算量O(N))で構成されており、シンプルかつ効率的に最適な頂点を見つけることができます。正多角形の頂点間の距離を「頂点番号の差の絶対値」として扱うことで、複雑な幾何学的計算を避けながら問題を解決できる点がポイントです。
このチュートリアルについてご質問がある場合は、コメント欄でお気軽にお知らせください。
-
C++で二分木の最も深い葉ノードの値の合計を求める方法
はじめに二分木(バイナリツリー)が与えられたとき、その中で最も深い位置にある葉ノード(deepest leaves)の値の合計を求めることを考えます。例えば、次のような二分木があるとします。この場合、最も深い葉ノードは 7 と 4 であり、出力は 11 になります。解法のアプローチこの問題は、深さ優先探索(DFS)を用いて各レベルごとのノードの値の合計を記録し、最後に最大深度に対応する合計を取得することで解けます。具体的には、以下の手順に従います。レベルごとの合計を保持するマップ m と、最大深度を記録する変数 maxDepth を定義するノードとレベルを受け取る再帰メソッド solve()
-
C++で二分木の右側の葉(右葉)の合計を求める方法
二分木が与えられたとき、その木に含まれるすべての「右葉(右側につながった葉ノード)」の値の合計を求める問題を考えてみましょう。 例えば、次のような二分木が入力として与えられた場合を考えます。 この場合の出力は 17 になります。この二分木には値が 7 と 10 の2つの右葉が存在するためです。 解決のためのアプローチ この問題は、DFS(深さ優先探索)を利用することで効率的に解くことができます。手順は以下の通りです。 dfs() 関数を定義します。引数としてノード(node)とブール値のフラグ(add)を受け取ります。 node が null の場合は、何もせずに処理を終了して戻ります。