using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
const int UB_X = 6;
const int UB_Y = 5;
struct JyoutaiDef
{
internal int Level;
internal int CurrX;
internal int CurrY;
internal List<int> UsedSameXList;
internal List<int> UsedSameYList;
internal string Log;
}
static void Main()
{
var stk = new Stack<JyoutaiDef>();
JyoutaiDef WillPush;
WillPush.Level = 0;
WillPush.CurrX = WillPush.CurrY = 0;
WillPush.UsedSameXList = new List<int>();
WillPush.UsedSameYList = new List<int>();
WillPush.Log = string.Format("({0},{1})", WillPush.CurrX, WillPush.CurrY);
stk.Push(WillPush);
int AnswerLevel = int.MinValue;
while (stk.Count > 0) {
JyoutaiDef Popped = stk.Pop();
//クリア判定
if (Popped.CurrX == UB_X && Popped.CurrY == UB_Y) {
if (AnswerLevel < Popped.Level) {
AnswerLevel = Popped.Level;
Console.WriteLine("レベル={0}の解候補を発見", AnswerLevel);
Console.WriteLine(Popped.Log);
}
continue;
}
Action<int, int> PushSyori = (pNewX, pNewY) =>
{
//対称解の除外で最初は、横に移動
if (Popped.Level == 0 && pNewX != 1) return;
if (pNewX < 0 || UB_X < pNewX) return;
if (pNewY < 0 || UB_Y < pNewY) return;
//同じ直線上は2回まで移動可
if (Popped.CurrX == pNewX) {
if (Popped.UsedSameXList.Count(A => A == pNewX) >= 2) return;
WillPush.UsedSameXList = new List<int>(Popped.UsedSameXList) { pNewX };
WillPush.UsedSameYList = Popped.UsedSameYList;
}
else {
if (Popped.UsedSameYList.Count(A => A == pNewY) >= 2) return;
WillPush.UsedSameXList = Popped.UsedSameXList;
WillPush.UsedSameYList = new List<int>(Popped.UsedSameYList) { pNewY };
}
WillPush.Level = Popped.Level + 1;
WillPush.CurrX = pNewX;
WillPush.CurrY = pNewY;
WillPush.Log = Popped.Log + "," + string.Format("({0},{1})", pNewX, pNewY);
stk.Push(WillPush);
};
PushSyori(Popped.CurrX, Popped.CurrY - 1);
PushSyori(Popped.CurrX, Popped.CurrY + 1);
PushSyori(Popped.CurrX - 1, Popped.CurrY);
PushSyori(Popped.CurrX + 1, Popped.CurrY);
}
}
}
レベル=17の解候補を発見 (0,0),(1,0),(2,0),(2,1),(3,1),(4,1),(4,2),(5,2),(6,2),(6,3), (5,3),(6,3),(6,4),(5,4),(4,4),(4,5),(5,5),(6,5) レベル=19の解候補を発見 (0,0),(1,0),(2,0),(2,1),(3,1),(4,1),(4,2),(5,2),(6,2),(6,3), (5,3),(6,3),(6,4),(5,4),(4,4),(4,5),(5,5),(5,4),(5,5),(6,5) レベル=21の解候補を発見 (0,0),(1,0),(2,0),(2,1),(3,1),(4,1),(4,2),(5,2),(6,2),(6,3), (5,3),(5,4),(4,4),(4,3),(3,3),(3,4),(3,5),(4,5),(5,5),(5,4), (6,4),(6,5) レベル=23の解候補を発見 (0,0),(1,0),(2,0),(2,1),(3,1),(4,1),(4,2),(3,2),(2,2),(2,3), (1,3),(1,4),(1,5),(2,5),(3,5),(3,4),(3,3),(4,3),(4,4),(5,4), (5,5),(5,4),(6,4),(6,5) レベル=25の解候補を発見 (0,0),(1,0),(2,0),(2,1),(3,1),(3,2),(2,2),(1,2),(1,3),(1,4), (0,4),(0,5),(1,5),(2,5),(2,4),(3,4),(3,3),(4,3),(4,2),(4,1), (5,1),(5,2),(5,3),(6,3),(6,4),(6,5)
深さ優先探索で解いてます。