トップページに戻る    次の増井さんの書籍の問題へ    前の増井さんの書籍の問題へ

Q37 サイコロの反転


C#のソース

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<int[]> KouhoArrList = DeriveKouhoArrList();
        KouhoArrList.RemoveAll(X => IsCycleFirst(X));

        for (int I = 0; I <= KouhoArrList.Count - 1; I++) {
            Console.Write("解{0}は、", I + 1);
            Array.ForEach(KouhoArrList[I], X => Console.Write(X));
            Console.WriteLine();
        }
    }

    struct JyoutaiDef
    {
        internal int Level;
        internal List<int> NumList;
    }

    //サイコロの初期配置を列挙
    static List<int[]> DeriveKouhoArrList()
    {
        var WillReturn = new List<int[]>();

        var stk = new Stack<JyoutaiDef>();
        JyoutaiDef WillPish;
        WillPish.Level = 0;
        WillPish.NumList = new List<int>();
        stk.Push(WillPish);

        while (stk.Count > 0) {
            JyoutaiDef Popped = stk.Pop();

            //クリア判定
            if (Popped.Level == 6) {
                WillReturn.Add(Popped.NumList.ToArray());
                continue;
            }

            for (int I = 1; I <= 6; I++) {
                WillPish.Level = Popped.Level + 1;
                WillPish.NumList = new List<int>(Popped.NumList) { I };
                stk.Push(WillPish);
            }
        }
        return WillReturn;
    }

    //最初の項に循環するかを判定
    static bool IsCycleFirst(int[] pFirstKouArr)
    {
        var VisitedList = new List<int>();
        int[] CurrKouArr = pFirstKouArr;

        while (true) {
            int CurrKouInt = ArrToInt(CurrKouArr);
            if (VisitedList.Contains(CurrKouInt)) {
                return CurrKouInt == VisitedList[0];
            }
            VisitedList.Add(CurrKouInt);

            CurrKouArr = DeriveNextKouArr(CurrKouArr);
        }
    }

    //サイコロの移動後の配列を返す
    static int[] DeriveNextKouArr(int[] pArr)
    {
        var WillReturn = new List<int>(pArr);

        for (int I = 0; I <= pArr[0] - 1; I++) {
            WillReturn.Add(7 - pArr[I]);
        }
        WillReturn.RemoveRange(0, pArr[0]);
        return WillReturn.ToArray();
    }

    //配列をInt型で表現
    static int ArrToInt(int[] pArr)
    {
        int WillReturn = 0;
        foreach (int EachInt in pArr) {
            WillReturn *= 10;
            WillReturn += EachInt;
        }
        return WillReturn;
    }
}


実行結果

省略
解28900は、111135
解28901は、111134
解28902は、111133
解28903は、111132
解28904は、111131
解28905は、111115
解28906は、111114
解28907は、111113
解28908は、111112


解説

Listクラスでサイコロの移動を実装してます。