static bool Fit(PuzzleState startPuzzle ,Dictionary<ulong,List<RootState>> allRoots ,Dictionary<ulong,PuzzleState> nextPuzzles ,int number ,int number2 ,int i1 ,int i2 ,int i3 ,int i4 ,int i5 ,int i6 , ulong keepOutMask ) { bool[] keepOutMap = InitKeepOutMap(keepOutMask); int n1, n2, n3, n4 ; List<int> root = new List<int>(); PuzzleState tempPuzzle = startPuzzle; //Console.WriteLine("Call Fit! {0:D},{1:D}", number, number2); //startPuzzle.Print(); //Console.WriteLine("{0:X}", keepOutMask); do { //Console.WriteLine("} head of fit"); //tempPuzzle.Print(); n1 = tempPuzzle.NumberOf(i1); n2 = tempPuzzle.NumberOf(i2); n3 = tempPuzzle.NumberOf(i3); n4 = tempPuzzle.NumberOf(i4); if (n1 == number) { if (n2 == number2) { //Fin // 1 2 // ? ? if (allRoots.ContainsKey(tempPuzzle.data) == false) { allRoots[tempPuzzle.data] = new List<RootState>(); } allRoots[tempPuzzle.data].Add(new RootState(tempPuzzle.data, startPuzzle.data, root)); nextPuzzles[tempPuzzle.data] = tempPuzzle; return true; }else if (n3 == number2) { //NG // 1 ? // 2 ? //number2 to n5 tempPuzzle = MoveNumber(tempPuzzle, keepOutMap, number2, i5, root); }else if (n4 == number2) { if (n2 == 0) { //OK // 1 0 // ? 2 //number2 to n2 tempPuzzle = MoveNumber(tempPuzzle, keepOutMap, number2, i2, root); }else{ //NG // 1 ? // ? 2 //number2 to n6 tempPuzzle = MoveNumber(tempPuzzle, keepOutMap, number2, i6, root); } }else{ // 1 ? // ? ? //number to n2 tempPuzzle = MoveNumber(tempPuzzle, keepOutMap, number, i2, root); } }else if (n2 == number) { if (n1 == number2) { //NG // 2 1 // ? ? //number2 to n5 tempPuzzle = MoveNumber(tempPuzzle, keepOutMap, number2, i5, root); }else if (n3 == number2) { if (n1 == 0) { //NG // 0 1 // 2 ? //number2 to n6 tempPuzzle = MoveNumber(tempPuzzle, keepOutMap, number2, i6, root); }else{ //OK // ? 1 // 2 ? //number2 to n4 tempPuzzle = MoveNumber(tempPuzzle, keepOutMap, number2, i4, root); } }else if (n4 == number2) { //OK // ? 1 // ? 2 //lock number2 on n4 //number to n1 keepOutMap[i4] = true; tempPuzzle = MoveNumber(tempPuzzle, keepOutMap, number, i1, root); keepOutMap[i4] = false; }else{ // ? 1 x // ? ? y int ix = i2 + (i2 - i1); int iy = ix + (i3 - i1); //Console.WriteLine("ix={0:D} iy={1:D}", ix, iy); bool innerFlag = true; if (ix < 16 && (ix & 3) > (i2 & 3)) { if (tempPuzzle.NumberOf(ix) == 0 && iy < 16) { if (tempPuzzle.NumberOf(iy) == number2) { // ? 1 0 // ? ? 2 tempPuzzle = MoveNumber(tempPuzzle, keepOutMap, number2, ix, root); innerFlag = false; } }else if (tempPuzzle.NumberOf(ix) == number2) { // ? 1 2 // ? ? tempPuzzle = MoveNumber(tempPuzzle, keepOutMap, number, i1, root); if ( tempPuzzle != null ){ tempPuzzle = MoveNumber(tempPuzzle, keepOutMap, number2, i2, root); } innerFlag = false; } } if (innerFlag) { // lock number on n2 //number2 to n4 keepOutMap[i2] = true; tempPuzzle = MoveNumber(tempPuzzle, keepOutMap, number2, i4, root); keepOutMap[i2] = false; } } }else if (n3 == number) { if (n1 == number2) { //OK // 2 ? // 1 ? //lock number on n3 //number2 to n2 keepOutMap[i3] = true; tempPuzzle = MoveNumber(tempPuzzle, keepOutMap, number2, i2, root); keepOutMap[i3] = false; }else if( n2 == number2) { if (n1 == 0) { //OK // 0 2 // 1 ? //number to n1 tempPuzzle = MoveNumber(tempPuzzle, keepOutMap, number, i1, root); }else{ //NG // ? 2 // 1 ? //number to n5 tempPuzzle = MoveNumber(tempPuzzle, keepOutMap, number, i5, root); } }else if( n4 == number2) { if (n1 == 0) { //NG // 0 ? // 1 2 // number2 to n6 tempPuzzle = MoveNumber(tempPuzzle, keepOutMap, number2, i6, root); }else if (n2 == 0) { //NG // ? 0 // 1 2 // number to n5 tempPuzzle = MoveNumber(tempPuzzle, keepOutMap, number, i5, root); }else{ //OK // ? ? // 1 2 // number to n5 tempPuzzle = MoveNumber(tempPuzzle, keepOutMap, number, i5, root); } }else{ // ? ? // 1 ? //number to n2 tempPuzzle = MoveNumber(tempPuzzle, keepOutMap, number, i2, root); } }else if (n4 == number) { if (n1 == number2) { if (n2 == 0 ){ //NG // 2 0 // ? 1 //number to n5 tempPuzzle = MoveNumber(tempPuzzle, keepOutMap, number, i5, root); }else{ //OK // 2 ? // ? 1 //number to n3 tempPuzzle = MoveNumber(tempPuzzle, keepOutMap, number, i3, root); } }else if (n2 == number2) { //NG // ? 2 // ? 1 //number to n6 tempPuzzle = MoveNumber(tempPuzzle, keepOutMap, number, i6, root); }else if (n3 == number2) { if( n1 == 0 ){ //OK // 0 ? // 2 1 //number2 to n1 tempPuzzle = MoveNumber(tempPuzzle, keepOutMap, number2, i1, root); }else if (n2 == 0) { //OK // ? 0 // 2 1 //number to n2 tempPuzzle = MoveNumber(tempPuzzle, keepOutMap, number, i2, root); }else{ //NG // ? ? // 2 1 //number2 to n1 tempPuzzle = MoveNumber(tempPuzzle, keepOutMap, number2, i1, root); } }else{ // ? ? // ? 1 //number to n2 tempPuzzle = MoveNumber(tempPuzzle, keepOutMap, number, i2, root); } }else{ if( n1 == number2) { // 2 ? // ? ? //lock number2 on n1 //number to n3 keepOutMap[i1] = true; tempPuzzle = MoveNumber(tempPuzzle, keepOutMap, number, i3, root); keepOutMap[i1] = false; }else if( n2 == number2 || n3 == number2 || n4 == number2) { // ? 2 // ? ? //number2 to n1 // ? ? // 2 ? //number2 to n1 // ? ? // ? 2 //number2 to n1 tempPuzzle = MoveNumber(tempPuzzle, keepOutMap, number2, i1, root); }else{ //near number to each pos tempPuzzle = MoveNumber(tempPuzzle, keepOutMap, number, i2, root); } } } while ( tempPuzzle != null); #if DEBUG Console.WriteLine("unknown error?"); Filter f1 = new Filter(keepOutMask); f1.Print(); startPuzzle.Print(); #endif return false; }