C言語で解く変形ニムゲーム――最適な手で勝者を判定するアルゴリズム
変形ニムゲームとは?
変形ニムゲーム(Modified Game of Nim)は、配列を対象とした最適化ゲームの一種です。先攻プレイヤーの存在と、両者が取る最適な手に基づいて、最終的な勝者を予測します。
ゲームのロジック
このゲームでは、複数の要素を含む配列が与えられます。プレイヤー1(Player 1)とプレイヤー2(Player 2)の2人が対戦し、それぞれ自分が担当する数値を配列から取り除いていきます。具体的なルールは次のとおりです。
- プレイヤー1: 3で割り切れる数値をすべて取り除く
- プレイヤー2: 5で割り切れる数値をすべて取り除く
両プレイヤーが最適な戦略で要素を取り除いたとき、最終的にどちらが勝者となるかを求めるのがこの問題の狙いです。
サンプルケース
配列:{1, 5, 75, 2, 65, 7, 25, 6}
勝者:プレイヤーB
Aが75を除去 → Bが5を除去 → Aが6を除去 → Bが65を除去 → Aに打てる手がなくなり、Bの勝ち
解法のポイント
このプログラムでは、まず次の3つの値を数え上げます。
- プレイヤー1のみが除去できる要素の数
- プレイヤー2のみが除去できる要素の数
- 両方のプレイヤーが除去できる要素の数(3と5の両方で割り切れる、すなわち15の倍数)
そのうえで、特に「両方が除去できる要素」の数に応じて勝敗を判定します。プレイヤー1は先手であるため、たとえ除去すべき要素が相手より1つ多くても勝利できます。通常の場合は、除去できる要素数が多いほうが勝者となります。
ニムゲームの勝者を求めるCプログラム
#include <bits/stdc++.h>
using namespace std;
int main() {
int arr[] = {1,5, 75,2,65,7,25,6};
int n = sizeof(arr) / sizeof(arr[0]);
int movesA = 0, movesB = 0, movesBoth = 0;
for (int i = 0; i < n; i++) {
if (arr[i] % 3 == 0 && arr[i] % 5 == 0)
movesBoth++;
else if (arr[i] % 3 == 0)
movesA++;
else if (arr[i] % 5 == 0)
movesB++;
}
if (movesBoth == 0) {
if (movesA > movesB)
cout<<"Player 1 is the Winner";
cout<<"Player 2 is the Winner";
}
if (movesA + 1 > movesB)
cout<<"Player 1 is the Winner";
cout<<"Player 2 is the Winner";
return 0;
}
出力結果
Player 2 is the Winner
-
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
-
Xboxゲームバー(音声ウィンドウ)を削除する方法|Windows 10での無効化・完全アンインストール手順
Windows 10には、ゲーマー向けにプリインストールされたアプリや機能が数多く搭載されています。その一つが「Xboxゲームバー」ですが、一部のゲーマーにとっては煩わしく感じられることもあります。この記事では、より快適にゲームを楽しむために、Xboxゲームの音声ウィンドウを削除する方法を詳しく解説します。Windows 10では、初回サインイン時にいくつかのユニバーサル(UWP)アプリが自動的にインストールされます。しかし、これらのアプリの中には、キーボードとマウスとの相性があまり良くないものもあります。その代表例が、ゲーム中に表示されるオーバーレイ機能「Xboxゲームバー(Xboxゲーム音