トップページに戻る
次の競技プログラミングの問題へ
前の競技プログラミングの問題へ
AGC-020-A Move and Win
■■■問題■■■
N個のマスに区切られた細長い紙切れの上でゲームを行います。
マスには1からNまでの番号が順に付けられています。
アリスの駒はマスAに、ボリスの駒は別のマスBに置かれています。
二人にはターンが交互に訪れます。アリスが先手です。
ターンが回ってきたプレイヤーは、
自分の駒を現在のマスXから左隣のマス X-1 か右隣のマス X+1 のどちらかに動かさなければなりません。
ただし、駒を紙切れの外に出したり、相手の駒と同じマスに動かしてはいけません。
また、駒の移動は一ターンに一度だけ行わなければなりません。
駒を動かせなくなった人が負けで、相手の勝ちとなります。
二人とも、勝ちたいと思っています。二人とも最適にプレイするとき、どちらが勝つでしょうか?
■■■入力■■■
N A B
●2 <= N <= 100
●1 <= A < B <= N
●入力値はすべて整数である
■■■出力■■■
アリスが勝つ場合はAlice、ボリスが勝つ場合はBorys、どちらも勝つことができないならDrawと出力せよ。
C#のソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static string InputPattern = "Input1";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("5 2 4");
//Alice
//アリスは駒をマス3に動かせます。
//すると、ボリスは駒をマス3に動かすことができなくなり、マス5に動かすほかなくなります。
//そして、アリスが駒をマス4に動かすと、ボリスは駒を動かせなくなり負けます。
}
else if (InputPattern == "Input2") {
WillReturn.Add("2 1 2");
//Borys
//アリスは最初のターンで駒を動かせず負けます
}
else if (InputPattern == "Input3") {
WillReturn.Add("58 23 42");
//Borys
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
int[] wkArr = InputList[0].Split(' ').Select(X => int.Parse(X)).ToArray();
int N = wkArr[0];
int A = wkArr[1];
int B = wkArr[2];
while (true) {
if (++A == B) {
Console.WriteLine("Borys");
break;
}
if (--B == A) {
Console.WriteLine("Alice");
break;
}
}
}
}
解説
最適戦略をナイーブにシュミレーションしてます。