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

ABC-045-B 3人でカードゲームイージー

■■■問題■■■

Aさん、Bさん、Cさんの3人が以下のようなカードゲームをプレイしています。

●最初、3人はそれぞれa、b、cいずれかの文字が書かれたカードを、何枚か持っている。
  これらは入力で与えられた順番に持っており、途中で並べ替えたりしない。
●Aさんのターンから始まる。
●現在自分のターンである人がカードを1枚以上持っているならば、そのうち先頭のカードを捨てる。
  その後、捨てられたカードに書かれているアルファベットと同じ名前の人
  (例えば、カードにaと書かれていたならばAさん) のターンとなる。
●現在自分のターンである人がカードを1枚も持っていないならば、
  その人がゲームの勝者となり、ゲームは終了する。

3人が最初に持っているカードがそれぞれ先頭から順に与えられます。
具体的には、文字列SA、SB、SCが与えられます。

文字列SAのi文字目 ( 1 <= i <= |SA| ) に書かれている文字が、
Aさんの持っている中で先頭からi番目のカードに書かれている文字です。
文字列SB、SCについても同様です。

最終的に誰がこのゲームの勝者となるかを求めてください。

■■■入力■■■

SA
SB
SC

●1 <= |SA| <= 100
●1 <= |SB| <= 100
●1 <= |SC| <= 100
●SA、SB、SCに含まれる文字はそれぞれa、b、cのいずれか

■■■出力■■■

Aさんが勝つならA、Bさんが勝つならB、Cさんが勝つならCと出力せよ。


C#のソース

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static string InputPattern = "InputX";

    static List<string> GetInputList()
    {
        var WillReturn = new List<string>();

        if (InputPattern == "Input1") {
            WillReturn.Add("aca");
            WillReturn.Add("accc");
            WillReturn.Add("ca");
            //A
            //ゲームは以下のように進行します。
            //●Aさんが、持っている中で最初のカードaを捨てる。次はAさんの番となる。
            //●Aさんが、持っている中で最初のカードcを捨てる。次はCさんの番となる。
            //●Cさんが、持っている中で最初のカードcを捨てる。次はCさんの番となる。
            //●Cさんが、持っている中で最初のカードaを捨てる。次はAさんの番となる。
            //●Aさんが、持っている中で最初のカードaを捨てる。次はAさんの番となる。
            //●Aさんはもう持っているカードがない。よってAさんの勝利となり、ゲームは終了する。
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("abcb");
            WillReturn.Add("aacb");
            WillReturn.Add("bccc");
            //C
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();
        List<char> AList = InputList[0].ToList();
        List<char> BList = InputList[1].ToList();
        List<char> CList = InputList[2].ToList();

        char Curr = 'a';
        while (true) {
            List<char> pList = null;
            if (Curr == 'a') pList = AList;
            if (Curr == 'b') pList = BList;
            if (Curr == 'c') pList = CList;

            if (pList.Count == 0) break;

            Curr = pList[0];
            pList.RemoveAt(0);
        }

        if (Curr == 'a') Console.WriteLine('A');
        if (Curr == 'b') Console.WriteLine('B');
        if (Curr == 'c') Console.WriteLine('C');
    }
}


解説

Listクラスでシュミレーションしてます。