Revision b8dab9fd
Added by Leszek Koltunski over 2 years ago
| src/main/java/org/distorted/solvers/SolverPyraminx.java | ||
|---|---|---|
| 52 | 52 |
{3,2},{1,3},{0,3},{2,1},{2,0},{1,0} // order of those pairs determines edge twist
|
| 53 | 53 |
}; |
| 54 | 54 |
|
| 55 |
TablebasesAbstract mSolver; |
|
| 55 |
private TablebasesAbstract mSolver; |
|
| 56 |
private int[] mCornerTwist; |
|
| 56 | 57 |
|
| 57 | 58 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 58 | 59 |
|
| ... | ... | |
| 326 | 327 |
int[][] corners = new int[4][3]; |
| 327 | 328 |
int[][] edges = new int[6][2]; |
| 328 | 329 |
int[][] vertices= new int[4][3]; |
| 329 |
int[] corner_twist = new int[4]; |
|
| 330 | 330 |
int[] vertex_twist = new int[4]; |
| 331 |
mCornerTwist = new int[4]; |
|
| 331 | 332 |
|
| 332 | 333 |
getCorners(object,corners); |
| 333 | 334 |
getVertices(object,vertices); |
| ... | ... | |
| 350 | 351 |
|
| 351 | 352 |
for(int i=0; i<4; i++) |
| 352 | 353 |
{
|
| 353 |
corner_twist[i] = computePieceTwist(i,corners[i],faces1);
|
|
| 354 |
if( corner_twist[i]<0 ) return ERROR_CORNERS_CANNOT;
|
|
| 354 |
mCornerTwist[i] = computePieceTwist(i,corners[i],faces1);
|
|
| 355 |
if( mCornerTwist[i]<0 ) return ERROR_CORNERS_CANNOT;
|
|
| 355 | 356 |
} |
| 356 | 357 |
|
| 357 | 358 |
for(int i=0; i<4; i++) |
| ... | ... | |
| 498 | 499 |
return null; |
| 499 | 500 |
} |
| 500 | 501 |
|
| 502 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 503 |
|
|
| 504 |
private void addMove(int[] move, int axis, int twist) |
|
| 505 |
{
|
|
| 506 |
move[0] = axis; |
|
| 507 |
move[1] = (1<<2); |
|
| 508 |
move[2] = (twist==2 ? -1:twist); |
|
| 509 |
} |
|
| 510 |
|
|
| 511 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 512 |
|
|
| 513 |
private int[][] constructTipMoves(int[] twist) |
|
| 514 |
{
|
|
| 515 |
int total = 0; |
|
| 516 |
|
|
| 517 |
for(int i=0; i<4; i++) |
|
| 518 |
if( twist[i]!=0 ) total++; |
|
| 519 |
|
|
| 520 |
if( total>0 ) |
|
| 521 |
{
|
|
| 522 |
int[][] moves = new int[total][3]; |
|
| 523 |
|
|
| 524 |
int index=0; |
|
| 525 |
if( twist[0]!=0 ) { addMove(moves[index],1,twist[0]); index++; }
|
|
| 526 |
if( twist[1]!=0 ) { addMove(moves[index],0,twist[1]); index++; }
|
|
| 527 |
if( twist[2]!=0 ) { addMove(moves[index],3,twist[2]); index++; }
|
|
| 528 |
if( twist[3]!=0 ) { addMove(moves[index],2,twist[3]); }
|
|
| 529 |
|
|
| 530 |
return moves; |
|
| 531 |
} |
|
| 532 |
|
|
| 533 |
return null; |
|
| 534 |
} |
|
| 535 |
|
|
| 501 | 536 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 502 | 537 |
|
| 503 | 538 |
public int[][] solution(int index, Resources res) |
| ... | ... | |
| 507 | 542 |
mSolver = ImplementedTablebasesList.createPacked(res,ObjectType.PYRA_3); |
| 508 | 543 |
} |
| 509 | 544 |
|
| 510 |
return mSolver!=null ? mSolver.solution(index) : null; |
|
| 545 |
int[][] moves1 = mSolver!=null ? mSolver.solution(index) : null; |
|
| 546 |
int[][] moves2 = constructTipMoves(mCornerTwist); |
|
| 547 |
|
|
| 548 |
int len1 = (moves1==null ? 0:moves1.length); |
|
| 549 |
int len2 = (moves2==null ? 0:moves2.length); |
|
| 550 |
|
|
| 551 |
int[][] moves = new int[len1+len2][]; |
|
| 552 |
|
|
| 553 |
android.util.Log.e("D", "len1="+len1+" len2="+len2);
|
|
| 554 |
|
|
| 555 |
if( len1>0 ) System.arraycopy(moves1, 0, moves, 0, len1); |
|
| 556 |
if( len2>0 ) System.arraycopy(moves2, 0, moves, len1, len2); |
|
| 557 |
|
|
| 558 |
return moves; |
|
| 511 | 559 |
} |
| 512 | 560 |
} |
| 513 | 561 |
|
Also available in: Unified diff
Pyraminx solver: add tips.