C++でコインゲームの勝者を予測する方法
問題概要
このゲームには2人のプレイヤーXとYが登場します。両者が最適な戦略でプレイし、Xが先手である場合、どちらが勝利するかを予測するのが私たちのタスクです。
ゲームのルール
コインゲームでは、それぞれN枚とM枚のコインが入った2つの山が用意されています。プレイヤーの一方がゲームに使う山を1つ選び、選んだ山を半分ずつに分割していきます。これを、どちらかのプレイヤーがそれ以上分割できなくなるまで繰り返します。
具体例
問題を理解するために、具体例を見てみましょう。
Input: M = 2 , N = 2 Output: X
解説 − Xが先手でMの山を選び(どちらの山も同じ枚数)、山を2つに分割します。すると各山にはコインが1枚しか残らないため、Yは手詰まりとなり、Xの勝利が確定します。
解法のアプローチ
この問題を解くには、プレイヤーXが勝利する条件を見極める必要があります。Xが勝つのは、どちらかの山に偶数枚のコインがある場合です。両方の山が奇数枚であれば、Yが勝者となります。
このロジックを実装したプログラムが以下の通りです。
実装例
#include <iostream>
using namespace std;
int isXWinner(int M, int N) {
if (M % 2 == 0 || N % 2 == 0)
return 1;
return 0;
}
int main() {
int M = 1, N = 2;
cout<<"Game Starts!\n";
if(isXWinner(M,N))
cout<<"Player X is the Winner";
else
cout<<"Player Y is the Winner";
return 0;
}出力
Game Starts! Player X is the Winner
-
C++で解く迷路問題:転がるボールが目的地に止まれるかをBFSで判定する方法
迷路の中にボールがあるとします。迷路には空きスペース(通路)と壁があります。ボールは上下左右のいずれかの方向に転がって空き通路を進むことができますが、壁にぶつかるまで止まりません。ボールが停止したときに、次の方向を選べます。この問題では、ボールの開始位置、目的地、そして迷路そのものが与えられ、「ボールが目的地の位置で停止できるかどうか」を判定する必要があります。迷路は2次元配列で表現され、1は壁、0は空きスペースを意味します。迷路の外周はすべて壁になっています。開始位置と目的地は行・列のインデックス(座標)で与えられます。問題例たとえば、次のような2次元配列で表される迷路を考えてみましょう。0
-
C++でJump Game IVを解く:BFSによる最小ジャンプ回数の求め方
問題の概要 整数型の配列 arr が与えられ、最初はインデックス 0 にいるものとします。1ステップごとに、次のいずれかの方法でジャンプが可能です。 インデックス i から i + x へ移動(条件:i + x < n) インデックス i から i - x へ移動(条件:i - x >= 0) arr[i] と arr[j] が同じ値で、i と j が異なる場合、i から j へ移動 ここで n は配列のサイズです。この問題の目的は、配列の最後のインデックスに到達するために必要な最小ジャンプ回数を求めることです。 入力例と出力 たとえば、入力が次のとおりだったとします。 {20