コード例 #1
0
        public static void InitUDSliceMoveConj()
        {
            CubieCube c = new CubieCube();
            CubieCube d = new CubieCube();

            for (int i = 0; i < N_SLICE; i++)
            {
                c.SetUDSlice(i);
                for (int j = 0; j < N_MOVES; j += 3)
                {
                    CubieCube.EdgeMult(c, CubieCube.moveCube[j], d);
                    UDSliceMove[i, j] = (char)d.GetUDSlice();
                }
                for (int j = 0; j < 16; j += 2)
                {
                    CubieCube.EdgeConjugate(c, CubieCube.SymMultInv[0, j], d);
                    UDSliceConj[i, j >> 1] = (char)d.GetUDSlice();
                }
            }
            for (int i = 0; i < N_SLICE; i++)
            {
                for (int j = 0; j < N_MOVES; j += 3)
                {
                    int udslice = UDSliceMove[i, j];
                    for (int k = 1; k < 3; k++)
                    {
                        udslice = UDSliceMove[udslice, j];
                        UDSliceMove[i, j + k] = (char)udslice;
                    }
                }
            }
        }
コード例 #2
0
        public bool SetWithPrun(CubieCube cc, int depth)
        {
            twist = cc.GetTwistSym();
            flip  = cc.GetFlipSym();
            tsym  = twist & 7;
            twist = twist >> 3;

            prun = Search.USE_TWIST_FLIP_PRUN ? GetPruning(TwistFlipPrun,
                                                           twist << 11 | CubieCube.FlipS2RF[flip ^ tsym]) : 0;
            if (prun > depth)
            {
                return(false);
            }

            fsym = flip & 7;
            flip = flip >> 3;

            slice = cc.GetUDSlice();
            prun  = Math.Max(prun, Math.Max(
                                 GetPruning(UDSliceTwistPrun,
                                            twist * N_SLICE + UDSliceConj[slice, tsym]),
                                 GetPruning(UDSliceFlipPrun,
                                            flip * N_SLICE + UDSliceConj[slice, fsym])));
            if (prun > depth)
            {
                return(false);
            }

            if (Search.USE_CONJ_PRUN)
            {
                CubieCube pc = new CubieCube();
                CubieCube.CornConjugate(cc, 1, pc);
                CubieCube.EdgeConjugate(cc, 1, pc);
                twistc = pc.GetTwistSym();
                flipc  = pc.GetFlipSym();
                prun   = Math.Max(prun,
                                  GetPruning(TwistFlipPrun,
                                             (twistc >> 3) << 11 | CubieCube.FlipS2RF[flipc ^ (twistc & 7)]));
            }

            return(prun <= depth);
        }
コード例 #3
0
        public static void InitMPermMoveConj()
        {
            CubieCube c = new CubieCube();
            CubieCube d = new CubieCube();

            for (int i = 0; i < N_MPERM; i++)
            {
                c.SetMPerm(i);
                for (int j = 0; j < N_MOVES2; j++)
                {
                    CubieCube.EdgeMult(c, CubieCube.moveCube[Util.ud2std[j]], d);
                    MPermMove[i, j] = (char)d.GetMPerm();
                }
                for (int j = 0; j < 16; j++)
                {
                    CubieCube.EdgeConjugate(c, CubieCube.SymMultInv[0, j], d);
                    MPermConj[i, j] = (char)d.GetMPerm();
                }
            }
        }