| 411 | } |
| 412 | |
| 413 | public boolean search3(int edge, int ct, int prun, int maxl, int lm, int depth) { |
| 414 | if (maxl == 0) { |
| 415 | return edge == 0 && ct == 0; |
| 416 | } |
| 417 | tempe[depth].set(edge); |
| 418 | for (int m=0; m<17; m++) { |
| 419 | if (ckmv3[lm][m]) { |
| 420 | m = skipAxis3[m]; |
| 421 | continue; |
| 422 | } |
| 423 | int ctx = Center3.ctmove[ct][m]; |
| 424 | int prun1 = Center3.prun[ctx]; |
| 425 | if (prun1 >= maxl) { |
| 426 | if (prun1 > maxl && m < 14) { |
| 427 | m = skipAxis3[m]; |
| 428 | } |
| 429 | continue; |
| 430 | } |
| 431 | int edgex = Edge3.getmvrot(tempe[depth].edge, m<<3, 10); |
| 432 | |
| 433 | int cord1x = edgex / Edge3.N_RAW; |
| 434 | int symcord1x = Edge3.raw2sym[cord1x]; |
| 435 | int symx = symcord1x & 0x7; |
| 436 | symcord1x >>= 3; |
| 437 | int cord2x = Edge3.getmvrot(tempe[depth].edge, m<<3|symx, 10) % Edge3.N_RAW; |
| 438 | |
| 439 | int prunx = Edge3.getprun(symcord1x * Edge3.N_RAW + cord2x, prun); |
| 440 | if (prunx >= maxl) { |
| 441 | if (prunx > maxl && m < 14) { |
| 442 | m = skipAxis3[m]; |
| 443 | } |
| 444 | continue; |
| 445 | } |
| 446 | |
| 447 | if (search3(edgex, ctx, prunx, maxl - 1, m, depth + 1)) { |
| 448 | move3[depth] = m; |
| 449 | return true; |
| 450 | } |
| 451 | } |
| 452 | return false; |
| 453 | } |
| 454 | } |