C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で左右交互にN回移動した後の最終位置を求める方法

この問題では、3つの整数 N、A、B が与えられます。座標 0 の地点に立っている人が、まず右へ A ステップ進み、次に左へ B ステップ戻るという動作を交互に繰り返します。目的は、N 回の移動を完了した後の人物の最終的な座標を求めて出力することです。

問題例

入力: N = 4, A = 3, B = 1

出力: 4

説明:

1回目の移動 → 右に3 (+3)
2回目の移動 → 左に1 (-1)
3回目の移動 → 右に3 (+3)
4回目の移動 → 左に1 (-1)

4回移動後の位置 = +3 - 1 + 3 - 1 = 4

解き方の考え方

この問題を解くには、右方向の移動を正・左方向の移動を負として扱い、合計移動量を計算します。ここで重要なのは、奇数回目の移動は必ず右方向、偶数回目の移動は必ず左方向に行われるという規則性です。

つまり、N 回の移動のうち右方向への移動は (N+1)/2 回、左方向への移動は N/2 回発生します(整数除算・小数点以下切り捨て)。したがって、最終的な移動量は次の式で一発的に求められます。

Steps = ((n + 1) / 2) * a - (n / 2) * b

この式を使えば、実際に1回ずつ移動をシミュレーションする必要がなく、O(1) の計算量で答えを導き出せます。

C++による実装例

上記の解法を実装したプログラムは以下の通りです。

#include <iostream>
using namespace std;

void finalPosition(int n, int a, int b) {
    int steps = {((n + 1) / 2) * a - (n / 2) * b};
    cout << steps;
}

int main() {
    int N = 4, A = 3, B = 1;
    cout << "The final position of the person after " << N << " steps is ";
    finalPosition(N, A, B);
    return 0;
}

実行結果

The final position of the person after 4 steps is 4

まとめ

移動の交互パターンに着目して数式化することで、ループ処理なしに最終位置を効率的に計算できます。N が偶数・奇数のどちらの場合でも、整数除算の切り捨て特性によりこの式は正しく機能するため、シンプルかつ堅牢な実装になります。

  1. C++で解説:T秒後のカエルの位置を求める確率計算アルゴリズム

    n個の頂点からなる無向木(ツリー)があるとします。頂点には1からnまでの番号が付けられており、カエルは頂点1からジャンプを開始します。カエルは、現在いる頂点に隣接している「未訪問」の頂点へ、1秒でジャンプすることができますが、一度訪れた頂点へ戻ることはできません。ジャンプ先の候補が複数ある場合は、いずれも等しい確率でランダムに1つを選んで移動します。逆に、行ける未訪問の頂点がなくなったカエルは、その場で永遠に跳ね続けることになります。 木は辺の配列として与えられます。ここで求めたいのは、「t秒後にカエルが頂点targetの上にいる確率」です。 問題の例 たとえば、入力が n = 7、t = 2

  2. C++の演算子の優先順位と結合規則を徹底解説【一覧表付き】

    演算子の優先順位とはC++における演算子の優先順位(operator precedence)は、式の中で各項(オペランド)がどのようにグループ化されるかを決める重要なルールです。また、結合規則(associativity)とは、括弧がない場合に同じ優先順位を持つ演算子がどちらの方向から評価されるかを決める特性のことを指します。これらは式の評価結果に直接影響を与えます。演算子によって優先順位には差があり、一部の演算子は他の演算子よりも先に評価されます。たとえば、乗算演算子(*)は加算演算子(+)よりも高い優先順位を持っています。具体例:x = 7 + 3 * 2 の評価x = 7 + 3 * 2