トップページに戻る
次の競技プログラミングの問題へ
前の競技プログラミングの問題へ
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文のループで順に、
現在の○印が付いているカップの位置を管理してます。