| 348 | } |
| 349 | |
| 350 | private boolean phase2(int edge, int corner, boolean topEdgeFirst, boolean botEdgeFirst, int ml, int maxl, int depth, int lm) { |
| 351 | if (maxl == 0 && !topEdgeFirst && botEdgeFirst/*edge==0 && corner==0 && !topEdgeFirst && botEdgeFirst && ml==0*/) { |
| 352 | return true; |
| 353 | } |
| 354 | |
| 355 | //try each possible move. First twist; |
| 356 | if (lm != 0 && topEdgeFirst == botEdgeFirst) { |
| 357 | int edgex = Square.sqTwistMove[edge]; |
| 358 | int cornerx = Square.sqTwistMove[corner]; |
| 359 | |
| 360 | if (Square.SquarePrun[edgex << 1 | (1 - ml)] < maxl && Square.SquarePrun[cornerx << 1 | (1 - ml)] < maxl) { |
| 361 | move[depth] = 0; |
| 362 | if (phase2(edgex, cornerx, topEdgeFirst, botEdgeFirst, 1 - ml, maxl - 1, depth + 1, 0)) { |
| 363 | return true; |
| 364 | } |
| 365 | } |
| 366 | } |
| 367 | |
| 368 | //Try top layer |
| 369 | if (lm <= 0) { |
| 370 | boolean topEdgeFirstx = !topEdgeFirst; |
| 371 | int edgex = topEdgeFirstx ? Square.sqTopMove[edge] : edge; |
| 372 | int cornerx = topEdgeFirstx ? corner : Square.sqTopMove[corner]; |
| 373 | int m = topEdgeFirstx ? 1 : 2; |
| 374 | int prun1 = Square.SquarePrun[edgex << 1 | ml]; |
| 375 | int prun2 = Square.SquarePrun[cornerx << 1 | ml]; |
| 376 | while (m < 12 && prun1 <= maxl && prun1 <= maxl) { |
| 377 | if (prun1 < maxl && prun2 < maxl) { |
| 378 | move[depth] = m; |
| 379 | if (phase2(edgex, cornerx, topEdgeFirstx, botEdgeFirst, ml, maxl - 1, depth + 1, 1)) { |
| 380 | return true; |
| 381 | } |
| 382 | } |
| 383 | topEdgeFirstx = !topEdgeFirstx; |
| 384 | if (topEdgeFirstx) { |
| 385 | edgex = Square.sqTopMove[edgex]; |
| 386 | prun1 = Square.SquarePrun[edgex << 1 | ml]; |
| 387 | m += 1; |
| 388 | } else { |
| 389 | cornerx = Square.sqTopMove[cornerx]; |
| 390 | prun2 = Square.SquarePrun[cornerx << 1 | ml]; |
| 391 | m += 2; |
| 392 | } |
| 393 | } |
| 394 | } |
| 395 | |
| 396 | if (lm <= 1) { |
| 397 | boolean botEdgeFirstx = !botEdgeFirst; |
| 398 | int edgex = botEdgeFirstx ? Square.sqBottomMove[edge] : edge; |
| 399 | int cornerx = botEdgeFirstx ? corner : Square.sqBottomMove[corner]; |
| 400 | int m = botEdgeFirstx ? 1 : 2; |
| 401 | int prun1 = Square.SquarePrun[edgex << 1 | ml]; |
| 402 | int prun2 = Square.SquarePrun[cornerx << 1 | ml]; |
| 403 | while (m < (maxl > 6 ? 6 : 12) && prun1 <= maxl && prun1 <= maxl) { |
| 404 | if (prun1 < maxl && prun2 < maxl) { |
| 405 | move[depth] = -m; |
| 406 | if (phase2(edgex, cornerx, topEdgeFirst, botEdgeFirstx, ml, maxl - 1, depth + 1, 2)) { |
| 407 | return true; |