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

No.26 シャッフルゲーム

■■■問題■■■

太郎君と二郎君はゲームをしています。

テーブルの上にカップが3つあり、その中の1つだけに○印、
それ以外の2つには×印が外から見えないように記されています。

太郎君から見て左にあるカップから1番、2番、3番として、
最初に○印がどのカップについてるかが公開された後、
二郎君は、何度かカップの位置をそれぞれ入れ替えるので、
太郎君はどのカップに○印が付いているかを当てなければなりません。

入れ替え中も入れ替えた後も、常に、左にあるカップから1番、2番、3番とし、
最初以外は、カップについている印は見ることは出来ません。

入力に、最初に○印が付いているカップの位置番号と、
二郎君が入れ替えたカップの位置番号が与えられるので、
最終的に○印が付いているカップの位置番号を出力してください。

■■■入力■■■

N
M
P1 Q1
P2 Q2
・ ・
・ ・
・ ・
PM QM

1行目に、最初に○印が付いているカップの位置を表す整数 N (1 <= N <= 3)が与えられる。
2行目に、カップを入れ替えた回数を表す整数 M (1 <= M <= 200)が与えられる。
続くM行に、入れ替えるカップの位置番号を表す整数 Pi,Qi (1 <= Pi,Qi <= 3, 1 <= i <= M, Pi != Qi)が
スペース区切りで与えられる。

■■■出力■■■

最終的に○印が付いているカップの位置番号を出力してください。
最後に改行してください。


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("1");
            WillReturn.Add("1");
            WillReturn.Add("1 3");
            //3
            //最初、左(1)のカップに○印が付いており、
            //左(1)のカップと右(3)のカップを入れ替えたので
            //最終的に右(3)のカップに○印が付いています
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("1");
            WillReturn.Add("3");
            WillReturn.Add("2 3");
            WillReturn.Add("3 2");
            WillReturn.Add("2 3");
            //1
            //最初の位置のまま変わりません
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();
        int MaruCup = int.Parse(InputList[0]);

        foreach (string EachChangeInfo in InputList.Skip(2)) {
            string[] wkArr = EachChangeInfo.Split(' ');
            int FromCup = int.Parse(wkArr[0]);
            int ToCup = int.Parse(wkArr[1]);

            if (FromCup == MaruCup)
                MaruCup = ToCup;
            else if (ToCup == MaruCup)
                MaruCup = FromCup;
        }
        Console.WriteLine(MaruCup);
    }
}


解説

ForEach文のループで順に、
現在の○印が付いているカップの位置を管理してます。