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

cornersx.h (2026B)


      1 STATIC bool is_cornersx_solved(uint64_t, const unsigned char *);
      2 
      3 STATIC coord_t coordinate_cornersx = {
      4 	.name = "CORNERSX",
      5 	.coord = &coordinate_corners_coord,
      6 	.cube = &coordinate_corners_cube,
      7 	.isnasty = &coordinate_corners_isnasty,
      8 	.gendata = coordinate_corners_gendata,
      9 	.max = CLASSES_CP_48 * POW_3_7,
     10 	.trans_mask = TM_ALLTRANS,
     11 	.moves_mask_gendata = MM18_ALLMOVES,
     12 	.moves_mask_solve = MM18_URF,
     13 	.is_admissible = &solution_always_valid,
     14 	.solution_prune = NULL,
     15 	.is_solvable = &cube_true,
     16 	.is_solved = &is_cornersx_solved,
     17 	.allow_niss = false,
     18 	.pruning_distribution = {
     19 		[0] = 5,
     20 		[1] = 11,
     21 		[2] = 42,
     22 		[3] = 240,
     23 		[4] = 1115,
     24 		[5] = 5848,
     25 		[6] = 29088,
     26 		[7] = 133410,
     27 		[8] = 508020,
     28 		[9] = 1100543,
     29 		[10] = 371364,
     30 		[11] = 2322,
     31 	},
     32 	.pruning_max = 11,
     33 	.sym = {
     34 		.classes = CLASSES_CP_48,
     35 		.max = FACT_8,
     36 		.coord = &coord_cp,
     37 		.cube = &invcoord_cp,
     38 		.max2 = POW_3_7,
     39 		.coord2 = &coord_co,
     40 		.cube2 = &invcoord_co,
     41 		.merge = &coordinate_merge_cpco,
     42 	},
     43 };
     44 
     45 STATIC bool
     46 is_cornersx_solved(uint64_t coord, const unsigned char *data)
     47 {
     48 	/*
     49 	TODO we use a bit of an ugly trick to check all rotated versions of
     50         the cube. We would like to apply rotations, but our oriented_cube_t
     51 	type does not allow to do this directly (we would just be changing
     52 	the orientation field, not the cube itself). So we apply slice moves
     53 	instead. We should make this less ugly.
     54 	*/
     55 	static uint8_t mt[] = {
     56 		[MOVE_x] = MOVE_M, [MOVE_x2] = MOVE_M2, [MOVE_x3] = MOVE_M3,
     57 		[MOVE_y] = MOVE_E, [MOVE_y2] = MOVE_E2, [MOVE_y3] = MOVE_E3,
     58 		[MOVE_z] = MOVE_S3, [MOVE_z2] = MOVE_S2, [MOVE_z3] = MOVE_S
     59 	};
     60 
     61 	uint8_t i, j;
     62 	cube_t cube;
     63 	oriented_cube_t oc;
     64 
     65 	cube = coordinate_corners_cube(coord, data);
     66 	oc.orientation = ORIENTATION_UF;
     67 	for (i = ORIENTATION_UF; i <= ORIENTATION_BL; i++) {
     68 		oc.cube = cube;
     69 		for (j = 0; orientation_moves[i][j] != UINT8_MAX; j++)
     70 			oc = move_extended(oc, mt[orientation_moves[i][j]]);
     71 		if (coordinate_corners_coord(oc.cube, data) == 0)
     72 			return true;
     73 	}
     74 
     75 	return false;
     76 }