dreo.h (2484B)
1 #define DRESEP_CLASSES 81 2 3 STATIC uint64_t coord_dresep_nosym(cube_t); 4 STATIC cube_t invcoord_dresep_nosym(uint64_t); 5 STATIC cube_t coordinate_dreo_merge(cube_t, cube_t); 6 7 STATIC uint64_t coordinate_dreo_coord(cube_t, const unsigned char *); 8 STATIC cube_t coordinate_dreo_cube(uint64_t, const unsigned char *); 9 STATIC bool coordinate_dreo_isnasty(uint64_t, const unsigned char *); 10 STATIC size_t coordinate_dreo_gendata(unsigned char *); 11 12 STATIC bool is_dreo_solvable(cube_t); 13 14 STATIC coord_t coordinate_dreo = { 15 .name = "DREO", 16 .coord = &coordinate_dreo_coord, 17 .cube = &coordinate_dreo_cube, 18 .isnasty = &coordinate_dreo_isnasty, 19 .gendata = coordinate_dreo_gendata, 20 .max = DRESEP_CLASSES * POW_3_7, 21 .trans_mask = TM_UDRLFIX, 22 .moves_mask = MM18_EO, 23 .axistrans = { 24 [AXIS_UD] = TRANS_UFr, 25 [AXIS_RL] = TRANS_RFr, 26 [AXIS_FB] = TRANS_FDr, 27 }, 28 .is_admissible = &solution_lastqt_cw, 29 .is_solvable = &is_dreo_solvable, 30 .pruning_distribution = { 31 [0] = 1, 32 [1] = 1, 33 [2] = 4, 34 [3] = 22, 35 [4] = 160, 36 [5] = 1286, 37 [6] = 8550, 38 [7] = 42152, 39 [8] = 90748, 40 [9] = 33466, 41 [10] = 757, 42 }, 43 .pruning_max = 10, 44 .sym = { 45 .classes = DRESEP_CLASSES, 46 .max = COMB_12_4, 47 .coord = &coord_dresep_nosym, 48 .cube = &invcoord_dresep_nosym, 49 .max2 = POW_3_7, 50 .coord2 = &coord_co_u, 51 .cube2 = &invcoord_co_u, 52 .merge = &coordinate_dreo_merge, 53 }, 54 }; 55 56 STATIC uint64_t 57 coord_dresep_nosym(cube_t cube) 58 { 59 return (uint64_t)coord_esep(cube) / COMB_8_4; 60 } 61 62 STATIC cube_t 63 invcoord_dresep_nosym(uint64_t coord) 64 { 65 return invcoord_esep(coord * COMB_8_4); 66 } 67 68 STATIC cube_t 69 coordinate_dreo_merge(cube_t c1, cube_t c2) 70 { 71 cube_t merged; 72 73 merged = c1; 74 copy_corners(&merged, c2); 75 76 return merged; 77 } 78 79 STATIC uint64_t 80 coordinate_dreo_coord(cube_t cube, const unsigned char *data) 81 { 82 return coord_coord_generic(&coordinate_dreo, cube, data); 83 } 84 85 STATIC cube_t 86 coordinate_dreo_cube(uint64_t i, const unsigned char *data) 87 { 88 return coord_cube_generic(&coordinate_dreo, i, data); 89 } 90 91 STATIC bool 92 coordinate_dreo_isnasty(uint64_t i, const unsigned char *data) 93 { 94 return coord_isnasty_generic(&coordinate_dreo, i, data); 95 } 96 97 STATIC size_t 98 coordinate_dreo_gendata(unsigned char *data) 99 { 100 return coord_gendata_generic(&coordinate_dreo, data); 101 } 102 103 STATIC bool 104 is_dreo_solvable(cube_t cube) { 105 uint8_t c[8], e[12], i, cocount; 106 107 if (coord_eo(cube) != 0) 108 return false; 109 110 pieces(&cube, c, e); 111 112 for (i = 0, cocount = 0; i < 8; i++) 113 cocount += (c[i] & COBITS_2) >> COSHIFT; 114 115 return cocount % 3 == 0; 116 }