aboutsummaryrefslogtreecommitdiff
path: root/src/steps.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/steps.c56
1 files changed, 29 insertions, 27 deletions
diff --git a/src/steps.c b/src/steps.c
index ccf33df..7d1823e 100644
--- a/src/steps.c
+++ b/src/steps.c
@@ -1162,74 +1162,76 @@ static int
1162estimate_optimal_HTM(DfsArg *arg) 1162estimate_optimal_HTM(DfsArg *arg)
1163{ 1163{
1164 int target, ret; 1164 int target, ret;
1165 Move lbase; 1165 Move bl1;
1166 Cube aux; 1166 Cube aux;
1167 1167
1168 target = arg->d - arg->current_alg->len; 1168 ret = -1;
1169 ret = -1; 1169 target = arg->d - arg->current_alg->len;
1170 arg->inverse = (Cube){0}; 1170 bl1 = base_move(arg->last1);
1171 arg->inverse = (Cube){0};
1171 arg->badmovesinv = 0; 1172 arg->badmovesinv = 0;
1172 arg->badmoves = 0; 1173 arg->badmoves = 0;
1173 1174
1175 /* Corners */
1174 arg->ed->corners = ptableval(&pd_corners_HTM, arg->cube); 1176 arg->ed->corners = ptableval(&pd_corners_HTM, arg->cube);
1175 UPDATECHECKSTOP(ret, arg->ed->corners, target); 1177 UPDATECHECKSTOP(ret, arg->ed->corners, target);
1176 1178
1179 /* Normal probing */
1177 arg->ed->normal_ud = ptableval(&pd_khuge_HTM, arg->cube); 1180 arg->ed->normal_ud = ptableval(&pd_khuge_HTM, arg->cube);
1178 UPDATECHECKSTOP(ret, arg->ed->normal_ud, target); 1181 UPDATECHECKSTOP(ret, arg->ed->normal_ud, target);
1179 if (arg->ed->normal_ud == target) {
1180 arg->badmovesinv |= (1<<U) | (1<<U2) | (1<<U3) |
1181 (1<<D) | (1<<D2) | (1<<D3);
1182 }
1183
1184 aux = apply_trans(fd, arg->cube); 1182 aux = apply_trans(fd, arg->cube);
1185 arg->ed->normal_fb = ptableval(&pd_khuge_HTM, aux); 1183 arg->ed->normal_fb = ptableval(&pd_khuge_HTM, aux);
1186 UPDATECHECKSTOP(ret, arg->ed->normal_fb, target); 1184 UPDATECHECKSTOP(ret, arg->ed->normal_fb, target);
1187 if (arg->ed->normal_fb == target) {
1188 arg->badmovesinv |= (1<<F) | (1<<F2) | (1<<F3) |
1189 (1<<B) | (1<<B2) | (1<<B3);
1190 }
1191
1192 aux = apply_trans(rf, arg->cube); 1185 aux = apply_trans(rf, arg->cube);
1193 arg->ed->normal_rl = ptableval(&pd_khuge_HTM, aux); 1186 arg->ed->normal_rl = ptableval(&pd_khuge_HTM, aux);
1194 UPDATECHECKSTOP(ret, arg->ed->normal_rl, target); 1187 UPDATECHECKSTOP(ret, arg->ed->normal_rl, target);
1195 if (arg->ed->normal_rl == target) {
1196 arg->badmovesinv |= (1<<R) | (1<<R2) | (1<<R3) |
1197 (1<<L) | (1<<L2) | (1<<L3);
1198 }
1199 1188
1189 /* If ret == 0, it's solved (corners + triple slice solved) */
1200 if (ret == 0) 1190 if (ret == 0)
1201 return ret; 1191 return ret;
1202 1192
1193 /* Michel de Bondt's trick*/
1203 if (arg->ed->normal_ud == arg->ed->normal_fb && 1194 if (arg->ed->normal_ud == arg->ed->normal_fb &&
1204 arg->ed->normal_fb == arg->ed->normal_rl) 1195 arg->ed->normal_fb == arg->ed->normal_rl)
1205 UPDATECHECKSTOP(ret, arg->ed->normal_ud + 1, target); 1196 UPDATECHECKSTOP(ret, arg->ed->normal_ud + 1, target);
1206 1197
1207 /* TODO: avoid computation of inverse if unnecessary */ 1198 /* Inverse probing */
1208 lbase = base_move(arg->last1);
1209 arg->inverse = inverse_cube(arg->cube); 1199 arg->inverse = inverse_cube(arg->cube);
1210 1200 if ((bl1 != U && bl1 != D) || (arg->ed->inverse_ud == -1)) {
1211 if ((lbase != U && lbase != D) || (arg->ed->inverse_ud == -1)) {
1212 arg->ed->inverse_ud = ptableval(&pd_khuge_HTM, arg->inverse); 1201 arg->ed->inverse_ud = ptableval(&pd_khuge_HTM, arg->inverse);
1213 } 1202 }
1214 UPDATECHECKSTOP(ret, arg->ed->inverse_ud, target); 1203 UPDATECHECKSTOP(ret, arg->ed->inverse_ud, target);
1215 1204 if ((bl1 != F && bl1 != B) || (arg->ed->inverse_fb == -1)) {
1216 if ((lbase != F && lbase != B) || (arg->ed->inverse_fb == -1)) {
1217 aux = apply_trans(fd, arg->inverse); 1205 aux = apply_trans(fd, arg->inverse);
1218 arg->ed->inverse_fb = ptableval(&pd_khuge_HTM, aux); 1206 arg->ed->inverse_fb = ptableval(&pd_khuge_HTM, aux);
1219 } 1207 }
1220 UPDATECHECKSTOP(ret, arg->ed->inverse_fb, target); 1208 UPDATECHECKSTOP(ret, arg->ed->inverse_fb, target);
1221 1209 if ((bl1 != R && bl1 != L) || (arg->ed->inverse_rl == -1)) {
1222 if ((lbase != R && lbase != L) || (arg->ed->inverse_rl == -1)) {
1223 aux = apply_trans(rf, arg->inverse); 1210 aux = apply_trans(rf, arg->inverse);
1224 arg->ed->inverse_rl = ptableval(&pd_khuge_HTM, aux); 1211 arg->ed->inverse_rl = ptableval(&pd_khuge_HTM, aux);
1225 } 1212 }
1226 UPDATECHECKSTOP(ret, arg->ed->inverse_rl, target); 1213 UPDATECHECKSTOP(ret, arg->ed->inverse_rl, target);
1227 1214
1215 /* Michel de Bondt's trick*/
1228 if (arg->ed->inverse_ud == arg->ed->inverse_fb && 1216 if (arg->ed->inverse_ud == arg->ed->inverse_fb &&
1229 arg->ed->inverse_fb == arg->ed->inverse_rl) { 1217 arg->ed->inverse_fb == arg->ed->inverse_rl) {
1230 UPDATECHECKSTOP(ret, arg->ed->inverse_ud + 1, target); 1218 UPDATECHECKSTOP(ret, arg->ed->inverse_ud + 1, target);
1231 } 1219 }
1232 1220
1221 /* nxopt trick */
1222 if (arg->ed->normal_ud == target) {
1223 arg->badmovesinv |= (1<<U) | (1<<U2) | (1<<U3) |
1224 (1<<D) | (1<<D2) | (1<<D3);
1225 }
1226 if (arg->ed->normal_fb == target) {
1227 arg->badmovesinv |= (1<<F) | (1<<F2) | (1<<F3) |
1228 (1<<B) | (1<<B2) | (1<<B3);
1229 }
1230 if (arg->ed->normal_rl == target) {
1231 arg->badmovesinv |= (1<<R) | (1<<R2) | (1<<R3) |
1232 (1<<L) | (1<<L2) | (1<<L3);
1233 }
1234
1233 if (arg->ed->inverse_ud == target) { 1235 if (arg->ed->inverse_ud == target) {
1234 arg->badmoves |= (1<<U) | (1<<U2) | (1<<U3) | 1236 arg->badmoves |= (1<<U) | (1<<U2) | (1<<U3) |
1235 (1<<D) | (1<<D2) | (1<<D3); 1237 (1<<D) | (1<<D2) | (1<<D3);

Generated with cgit - Back to sebastiano.tronto.net