トップページに戻る    次の競技プログラミングの問題へ    前の競技プログラミングの問題へ

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;
            }
        }
    }
}


解説

最適戦略をナイーブにシュミレーションしてます。