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

【C++】ロボットが(0,0)から(x,y)へ移動する際の最小ステップ数を求めるプログラム

問題概要

座標 (x, y) が与えられているとします。2次元グリッド上で、ロボットは初期位置 (0, 0) におり、目標地点 (x, y) への移動を目指しています。ロボットは1回のコマンドで「上」「下」「左」「右」のいずれかに移動するか、現在のマスにとどまる(待機する)ことができます。ここで、目的地に到達するまでに必要なコマンド数、つまりステップ数の最小値を求めることが課題です。

入力例と出力例

たとえば、入力が x = 3、y = 4 の場合、出力は 7 になります。

解法のアプローチ

この問題は、以下の式を使って答えを直接計算することで解けます。

return x + y + min(|x - y|, |x - y + 1|, |x - y - 1|)

つまり、基本となる「x + y」に対して、「|x − y|」「|x − y + 1|」「|x − y − 1|」という3つの絶対値の中で最も小さい値を加算したものが答えになります。abs() で絶対差を求め、min() を入れ子にすることで3つの候補の中から最小値を簡単に取り出せるのがポイントです。

C++による実装例

理解を深めるために、以下の実装例を見てみましょう。

#include <bits/stdc++.h>
using namespace std;

int solve(int x, int y) {
   return x + y + min(abs(x - y), min(abs(x - y + 1), abs(x - y - 1)));
}

int main() {
   int x = 3;
   int y = 4;
   cout << solve(x, y) << endl;
}

実行結果

入力

3, 4

出力

7

まとめ

このプログラムでは、solve 関数が座標の差を利用した計算式によって最小ステップ数を返します。main 関数から x = 3、y = 4 を渡すと、x + y = 7 に絶対差の最小値 0 が加わり、結果として 7 が出力されます。このように、グリッド上の移動問題では各軸の座標差に着目することで、シンプルな数式で最短手数を効率よく導出できます。

  1. C++で対戦相手を捕まえるために必要な最小ラウンド数を求めるプログラム

    問題の概要 木構造の辺のリストが [u, v] の形式で与えられるとします。これは頂点 u と頂点 v の間に無向辺が存在することを表しています。さらに、2つの整数 x と y も与えられます。自分は頂点 x におり、対戦相手は頂点 y に位置しています。ゲームは第1ラウンドに自分が移動し、次のラウンドで対戦相手が移動するという形で交互に進行します。対戦相手は、自分の番に移動せずその場にとどまることも選択できます。このとき、対戦相手を捕まえるために必要な最小ラウンド数を求めるのが課題です。 たとえば、入力が edges = [[0, 1], [0, 2], [1, 3], [1, 4]]、x

  2. 【C++】1からNまでの対数計算に必要なログ値の最小数を求めるアルゴリズム

    対数には log(x*y) = log(x) + log(y) という重要な性質があります。この性質を利用すると、「1からNまでのすべての対数値を計算するために、最低いくつの対数値を直接求めればよいか」という興味深い問題を考えることができます。 例として、Nが6の場合を考えてみましょう。このとき答えは 3 になります。 まず log(1) は常に0であるため、計算対象から除外します。 log(2) と log(3) は素数なので、独立に計算する必要があります。(ここまで2つ) log(4) は log(2) + log(2) で表せるため、既知の値を再利用すれば新たな計算は不要です。 log