dr.h (3056B)
1 #define DREOESEP_CLASSES UINT64_C(64430) 2 #define DREOESEP_MAX (POW_2_11 * COMB_12_4) 3 4 STATIC uint64_t coord_dreoesep_nosym(cube_t); 5 STATIC cube_t invcoord_dreoesep_nosym(uint64_t); 6 STATIC cube_t coordinate_dr_merge(cube_t, cube_t); 7 8 STATIC uint64_t coordinate_dr_coord(cube_t, const unsigned char *); 9 STATIC cube_t coordinate_dr_cube(uint64_t, const unsigned char *); 10 STATIC bool coordinate_dr_isnasty(uint64_t, const unsigned char *); 11 STATIC size_t coordinate_dr_gendata(unsigned char *); 12 13 STATIC bool is_eoco_solvable(cube_t); 14 15 /* TODO: remove the following two when all coordinates are converted to unsigned */ 16 STATIC uint64_t coord_co_u(cube_t c) { return (uint64_t)coord_co(c); } 17 STATIC cube_t invcoord_co_u(uint64_t i) { return invcoord_co((int64_t)i); } 18 19 STATIC coord_t coordinate_dr = { 20 .name = "DR", 21 .coord = &coordinate_dr_coord, 22 .cube = &coordinate_dr_cube, 23 .isnasty = &coordinate_dr_isnasty, 24 .gendata = coordinate_dr_gendata, 25 .max = DREOESEP_CLASSES * POW_3_7, 26 .trans_mask = TM_UDFIX, 27 .moves_mask = MM18_ALLMOVES, 28 .axistrans = { 29 [AXIS_UD] = TRANS_UFr, 30 [AXIS_RL] = TRANS_RFr, 31 [AXIS_FB] = TRANS_FDr, 32 }, 33 .is_admissible = &solution_lastqt_cw, 34 .is_solvable = &is_eoco_solvable, 35 .pruning_distribution = { 36 [0] = 1, 37 [1] = 1, 38 [2] = 5, 39 [3] = 44, 40 [4] = 487, 41 [5] = 5841, 42 [6] = 68364, 43 [7] = 776568, 44 [8] = 7950748, 45 [9] = 52098876, 46 [10] = 76236234, 47 [11] = 3771112, 48 [12] = 129, 49 }, 50 .pruning_max = 12, 51 .sym = { 52 .classes = DREOESEP_CLASSES, 53 .max = DREOESEP_MAX, 54 .coord = &coord_dreoesep_nosym, 55 .cube = &invcoord_dreoesep_nosym, 56 .max2 = POW_3_7, 57 .coord2 = &coord_co_u, 58 .cube2 = &invcoord_co_u, 59 .merge = &coordinate_dr_merge, 60 }, 61 }; 62 63 STATIC uint64_t 64 coord_dreoesep_nosym(cube_t cube) 65 { 66 uint64_t eo, esep; 67 68 esep = coord_esep(cube) / COMB_8_4; 69 eo = coord_eo(cube); 70 71 return esep * POW_2_11 + eo; 72 } 73 74 STATIC cube_t 75 invcoord_dreoesep_nosym(uint64_t coord) 76 { 77 uint64_t eo, esep; 78 cube_t cube; 79 80 eo = coord % POW_2_11; 81 esep = (coord / POW_2_11) * COMB_8_4; 82 cube = invcoord_esep(esep); 83 set_eo(&cube, eo); 84 85 return cube; 86 } 87 88 STATIC cube_t 89 coordinate_dr_merge(cube_t c1, cube_t c2) 90 { 91 cube_t merged; 92 93 merged = c1; 94 copy_corners(&merged, c2); 95 96 return merged; 97 } 98 99 STATIC uint64_t 100 coordinate_dr_coord(cube_t cube, const unsigned char *data) 101 { 102 return coord_coord_generic(&coordinate_dr, cube, data); 103 } 104 105 STATIC cube_t 106 coordinate_dr_cube(uint64_t i, const unsigned char *data) 107 { 108 return coord_cube_generic(&coordinate_dr, i, data); 109 } 110 111 STATIC bool 112 coordinate_dr_isnasty(uint64_t i, const unsigned char *data) 113 { 114 return coord_isnasty_generic(&coordinate_dr, i, data); 115 } 116 117 STATIC size_t 118 coordinate_dr_gendata(unsigned char *data) 119 { 120 return coord_gendata_generic(&coordinate_dr, data); 121 } 122 123 STATIC bool 124 is_eoco_solvable(cube_t cube) { 125 uint8_t c[8], e[12], i, cocount, eocount; 126 127 pieces(&cube, c, e); 128 129 for (i = 0, cocount = 0; i < 8; i++) 130 cocount += (c[i] & COBITS_2) >> COSHIFT; 131 132 for (i = 0, eocount = 0; i < 12; i++) 133 eocount += (e[i] & EOBIT) >> EOSHIFT; 134 135 return cocount % 3 == 0 && eocount % 2 == 0; 136 }