トップページに戻る
次の増井さんの書籍の問題へ
前の増井さんの書籍の問題へ
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クラスでサイコロの移動を実装してます。