nissy-core

The "engine" of nissy, including the H48 optimal solver.
git clone https://git.tronto.net/nissy-core
Download | Log | Files | Refs | README | LICENSE

dreo.h (2288B)


      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 	.sym = {
     31 		.classes = DRESEP_CLASSES,
     32 		.max = COMB_12_4,
     33 		.coord = &coord_dresep_nosym,
     34 		.cube = &invcoord_dresep_nosym,
     35 		.max2 = POW_3_7,
     36 		.coord2 = &coord_co_u,
     37 		.cube2 = &invcoord_co_u,
     38 		.merge = &coordinate_dreo_merge,
     39 	},
     40 };
     41 
     42 STATIC uint64_t
     43 coord_dresep_nosym(cube_t cube)
     44 {
     45 	return (uint64_t)coord_esep(cube) / COMB_8_4;
     46 }
     47 
     48 STATIC cube_t
     49 invcoord_dresep_nosym(uint64_t coord)
     50 {
     51 	return invcoord_esep(coord * COMB_8_4);
     52 }
     53 
     54 STATIC cube_t
     55 coordinate_dreo_merge(cube_t c1, cube_t c2)
     56 {
     57 	cube_t merged;
     58 
     59 	merged = c1;
     60 	copy_corners(&merged, c2);
     61 
     62 	return merged;
     63 }
     64 
     65 STATIC uint64_t
     66 coordinate_dreo_coord(cube_t cube, const unsigned char *data)
     67 {
     68 	return coord_coord_generic(&coordinate_dreo, cube, data);
     69 }
     70 
     71 STATIC cube_t
     72 coordinate_dreo_cube(uint64_t i, const unsigned char *data)
     73 {
     74 	return coord_cube_generic(&coordinate_dreo, i, data);
     75 }
     76 
     77 STATIC bool
     78 coordinate_dreo_isnasty(uint64_t i, const unsigned char *data)
     79 {
     80 	return coord_isnasty_generic(&coordinate_dreo, i, data);
     81 }
     82 
     83 STATIC size_t
     84 coordinate_dreo_gendata(unsigned char *data)
     85 {
     86 	return coord_gendata_generic(&coordinate_dreo, data);
     87 }
     88 
     89 STATIC bool
     90 is_dreo_solvable(cube_t cube) {
     91 	uint8_t c[8], e[12], i, cocount;
     92 
     93 	if (coord_eo(cube) != 0)
     94 		return false;
     95 
     96 	pieces(&cube, c, e);
     97 
     98 	for (i = 0, cocount = 0; i < 8; i++)
     99 		cocount += (c[i] & COBITS_2) >> COSHIFT;
    100 
    101 	return cocount % 3 == 0;
    102 }