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