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


解説

オセロセットで考察すると
机ごとの一番上のコンテナ
コンテナごとの下にあるコンテナ
を管理すれば良いと分かります。