dr.h (2647B)
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 7 STATIC uint64_t coordinate_dr_coord(cube_t, const unsigned char *); 8 STATIC cube_t coordinate_dr_cube(uint64_t, const unsigned char *); 9 STATIC bool coordinate_dr_isnasty(uint64_t, const unsigned char *); 10 STATIC size_t coordinate_dr_gendata(unsigned char *); 11 12 STATIC bool is_eoco_solvable(cube_t); 13 14 STATIC coord_t coordinate_dr = { 15 .name = "DR", 16 .coord = &coordinate_dr_coord, 17 .cube = &coordinate_dr_cube, 18 .isnasty = &coordinate_dr_isnasty, 19 .gendata = coordinate_dr_gendata, 20 .max = DREOESEP_CLASSES * POW_3_7, 21 .trans_mask = TM_UDFIX, 22 .moves_mask_gendata = MM18_ALLMOVES, 23 .moves_mask_solve = MM18_ALLMOVES, 24 .is_admissible = &solution_lastqt_cw, 25 .solution_prune = NULL, 26 .is_solvable = &is_eoco_solvable, 27 .is_solved = NULL, 28 .allow_niss = true, 29 .pruning_distribution = { 30 [0] = 1, 31 [1] = 1, 32 [2] = 5, 33 [3] = 44, 34 [4] = 487, 35 [5] = 5841, 36 [6] = 68364, 37 [7] = 776568, 38 [8] = 7950748, 39 [9] = 52098876, 40 [10] = 76236234, 41 [11] = 3771112, 42 [12] = 129, 43 }, 44 .pruning_max = 12, 45 .sym = { 46 .classes = DREOESEP_CLASSES, 47 .max = DREOESEP_MAX, 48 .coord = &coord_dreoesep_nosym, 49 .cube = &invcoord_dreoesep_nosym, 50 .max2 = POW_3_7, 51 .coord2 = &coord_co, 52 .cube2 = &invcoord_co, 53 .merge = &coordinate_merge_ec, 54 }, 55 }; 56 57 STATIC uint64_t 58 coord_dreoesep_nosym(cube_t cube) 59 { 60 uint64_t eo, esep; 61 62 esep = coord_esep(cube) / COMB_8_4; 63 eo = coord_eo(cube); 64 65 return esep * POW_2_11 + eo; 66 } 67 68 STATIC cube_t 69 invcoord_dreoesep_nosym(uint64_t coord) 70 { 71 uint64_t eo, esep; 72 cube_t cube; 73 74 eo = coord % POW_2_11; 75 esep = (coord / POW_2_11) * COMB_8_4; 76 cube = invcoord_esep(esep); 77 set_eo(&cube, eo); 78 79 return cube; 80 } 81 82 STATIC uint64_t 83 coordinate_dr_coord(cube_t cube, const unsigned char *data) 84 { 85 return coord_coord_generic(&coordinate_dr, cube, data); 86 } 87 88 STATIC cube_t 89 coordinate_dr_cube(uint64_t i, const unsigned char *data) 90 { 91 return coord_cube_generic(&coordinate_dr, i, data); 92 } 93 94 STATIC bool 95 coordinate_dr_isnasty(uint64_t i, const unsigned char *data) 96 { 97 return coord_isnasty_generic(&coordinate_dr, i, data); 98 } 99 100 STATIC size_t 101 coordinate_dr_gendata(unsigned char *data) 102 { 103 return coord_gendata_generic(&coordinate_dr, data); 104 } 105 106 STATIC bool 107 is_eoco_solvable(cube_t cube) { 108 uint8_t c[8], e[12], i, cocount, eocount; 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 for (i = 0, eocount = 0; i < 12; i++) 116 eocount += (e[i] & EOBIT) >> EOSHIFT; 117 118 return cocount % 3 == 0 && eocount % 2 == 0; 119 }