AtCoderのPAST
次のPASTの問題へ
前のPASTの問題へ
第3回PAST K コンテナの移動
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("3 4");
WillReturn.Add("1 2 1");
WillReturn.Add("2 3 2");
WillReturn.Add("3 1 3");
WillReturn.Add("1 3 2");
//3
//3
//1
}
else if (InputPattern == "Input2") {
WillReturn.Add("10 20");
WillReturn.Add("3 6 3");
WillReturn.Add("6 5 6");
WillReturn.Add("10 8 10");
WillReturn.Add("5 7 3");
WillReturn.Add("1 3 1");
WillReturn.Add("4 10 4");
WillReturn.Add("5 4 6");
WillReturn.Add("10 7 4");
WillReturn.Add("7 9 3");
WillReturn.Add("9 8 4");
WillReturn.Add("8 1 4");
WillReturn.Add("3 7 1");
WillReturn.Add("2 3 2");
WillReturn.Add("9 8 3");
WillReturn.Add("8 1 10");
WillReturn.Add("8 2 8");
WillReturn.Add("9 10 9");
WillReturn.Add("2 1 8");
WillReturn.Add("4 9 6");
WillReturn.Add("1 7 4");
//7
//3
//7
//7
//5
//9
//7
//7
//10
//7
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
struct FTXInfoDef
{
internal int F;
internal int T;
internal int X;
}
static void Main()
{
List<string> InputList = GetInputList();
int[] wkArr = { };
Action<string> SplitAct = pStr =>
wkArr = pStr.Split(' ').Select(pX => int.Parse(pX)).ToArray();
SplitAct(InputList[0]);
int N = wkArr[0];
var FTXInfoList = new List<FTXInfoDef>();
foreach (string EachStr in InputList.Skip(1)) {
SplitAct(EachStr);
FTXInfoDef WillAdd;
WillAdd.F = wkArr[0];
WillAdd.T = wkArr[1];
WillAdd.X = wkArr[2];
FTXInfoList.Add(WillAdd);
}
// 一番上にある値[机]
var TopNumDict = new Dictionary<int, int?>();
for (int I = 1; I <= N; I++) {
TopNumDict[I] = I;
}
// 下にある値[値]
int?[] BottomValArr = new int?[N + 1];
for (int I = 1; I <= N; I++) {
BottomValArr[I] = null;
}
foreach (FTXInfoDef EachFTXInfo in FTXInfoList) {
int FromDesk = EachFTXInfo.F;
int ToDesk = EachFTXInfo.T;
int X = EachFTXInfo.X;
int? SavedTopNum1 = TopNumDict[FromDesk];
int? SavedTopNum2 = TopNumDict[ToDesk];
TopNumDict[FromDesk] = BottomValArr[X];
TopNumDict[ToDesk] = SavedTopNum1;
BottomValArr[X] = SavedTopNum2;
}
// 机[値]なDict
var AnswerDict = new Dictionary<int, int>();
foreach (var EachPair in TopNumDict) {
int CurrDesc = EachPair.Key;
int? CurrNum = EachPair.Value;
while (CurrNum != null) {
AnswerDict[CurrNum.Value] = CurrDesc;
CurrNum = BottomValArr[CurrNum.Value];
}
}
foreach (var EachPair in AnswerDict.OrderBy(pX => pX.Key)) {
Console.WriteLine(EachPair.Value);
}
}
}
解説
オセロセットで考察すると
机ごとの一番上のコンテナ
コンテナごとの下にあるコンテナ
を管理すれば良いと分かります。