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

C++で解く!ボール除去ゲームの勝者を判定するプログラム


問題概要

4つの整数 n1n2k1k2 が与えられます。ここに2つの箱があり、1つ目の箱には n1 個のボール、2つ目の箱には n2 個のボールが入っています。

Amal(アマル)と Bimal(ビマル)の2人がこのゲームをプレイします。Amal は自分の手番で1個から k1 個のボールを取り除くことができ、Bimal は1個から k2 個のボールを取り除くことができます。Amal が先手となり、2人は交互に手番を進めていきます。そして、自分の手番でボールを取り除けなくなったプレイヤーが負けとなります。このゲームの勝者が誰になるのかを求めるのが課題です。

具体例

例えば、入力が n1 = 2、n2 = 2、k1 = 1、k2 = 2 の場合を考えてみましょう。このときの出力は「Bimal」になります。どちらの箱にも2個ずつボールが入っている状態です。Amal が1つ目の箱から1個のボールを取り除くと、Bimal は2つ目の箱から1個または2個のボールを取ることができます。Amal がどのような手を選んでも、Bimal が最適な手を打ち続ければ必ず勝利できるのです。

解き方

この問題は、実はとてもシンプルに解くことができます。重要なポイントは、勝敗が k1 や k2 の値ではなく、n1 と n2 の大小関係だけで決まるという点です。各手番で必ず1個以上のボールを取り除けるため、ゲームは必ず有限回の手で終了します。n1 が n2 より大きい場合は Amal が、そうでない場合は Bimal が勝者となります。

したがって、次のようなロジックで答えを求められます。

if n1 > n2 then:
    return "Amal"
otherwise:
    return "Bimal"

C++による実装例

理解を深めるために、実際のコードを見てみましょう。

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

string solve(int n1, int n2, int k1, int k2) {
    if (n1 > n2)
        return "Amal";
    else
        return "Bimal";
}
int main() {
    int n1 = 2;
    int n2 = 2;
    int k1 = 1;
    int k2 = 2;
    cout << solve(n1, n2, k1, k2) << endl;
}

入力

2, 2, 1, 2

出力

Bimal
  1. Pythonでセット要素除去ゲームの勝者を判定するプログラムを作成する方法

    問題概要 1からnまでの自然数の集合 {1, 2, ..., n} があります。Amal(アマル)と Bimal(ビマル)の2人が、この集合を使って以下のルールでゲームを行います。 必ず Amal が先手です。 各ターンで、手番のプレイヤーは集合の中から素数 p を1つ選び、p とその倍数をすべて集合から取り除きます。 手を打てなくなったプレイヤーの負けです。n が与えられたとき、勝者の名前を求めてください。 例えば入力が n = 5 の場合、出力は「Amal」になります。初期状態の集合は {1, 2, 3, 4, 5} です。まず Amal が p = 2 を選ぶと、2 と 4 が取り除

  2. Pythonで配列除去ゲームの勝者を求めるプログラム

    AmalとBimalが、いくつかの数値を含む1つの配列Aを使ってゲームを行うことを考えます。ゲームのルールは以下の通りです。必ずBimalが先手です。各ターンで、プレイヤーは配列内の最大要素を削除し、その要素より右側にあるすべての要素も同時に削除します。2人のプレイヤーは交互に手番を行います。残りの要素をすべて取り除いたプレイヤーが勝者となります。例えば、入力が nums = [5,2,6,3,4] の場合、出力は「Amal」になります。まずBimalが最大要素の6とその右側の要素[3,4]を削除して配列は[5,2]となり、次にAmalが残りの要素をすべて削除するため、勝者はAmalです。解法