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; } } } }
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); }
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(); } } }