Ejemplo n.º 1
0
    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;
    }