예제 #1
0
 private void searchA(final int maxALength) {
   stackA[0].length = 0;
   stackA[0].turnIndex = 0;
   int d = 0;
   do {
     while (stackA[d].length < maxALength) {
       final ANode node = stackA[d];
       if (node.turnIndex >= node.turns.length) {
         if (--d < 0) return;
       } else {
         final Turn userTurn = node.turns[node.turnIndex++];
         node.userTurn = userTurn;
         final Turn cubeTurn = SymTransform.getTurn(userTurn, node.symmetry);
         node.cubeTurn = cubeTurn;
         final ANode nextNode = stackA[d + 1];
         final int length = node.length + metric.length(cubeTurn);
         if (length <= maxALength && length <= maxSearchLength) {
           final int ct = transform.twistTable.turn(cubeTurn, node.twist);
           final int ef = transform.flipTable.turn(cubeTurn, node.flip);
           aprn++;
           if (aprn % CYCLES_BETWEEN_USER_CHECK == 0 && (isInterrupted = reporter.shouldStop()))
             return;
           final int ct_ef_d = pruneA.get_twist_flip_dist(node.twist_flip_dist, ct, ef);
           if (ct_ef_d <= maxALength - length) {
             final int meps = transform.mEdgePosSetTable.turn(cubeTurn, node.mEdgePosSet);
             final int ct_meps_d =
                 pruneA.get_twist_mEdgePosSet_dist(node.twist_mEdgePosSet_dist, ct, meps);
             if (ct_meps_d <= maxALength - length) {
               final int ef_meps_d =
                   pruneA.get_flip_mEdgePosSet_dist(node.flip_mEdgePosSet_dist, ef, meps);
               if (ef_meps_d <= maxALength - length) {
                 final int ct_d = pruneA.get_twistFull_dist(node.twist_dist, ct);
                 final int ef_d = pruneA.get_flipFull_dist(node.flip_dist, ef);
                 if (ct_d <= maxALength - length && ef_d <= maxALength - length) {
                   nextNode.setCubeStateA(ct, ef, meps);
                   nextNode.setDists(ct_ef_d, ct_meps_d, ef_meps_d, ct_d, ef_d);
                   nextNode.setTurnState(node, userTurn, turnList);
                   nextNode.length = length;
                   d++;
                 } else apry++;
               } else apry++;
             } else apry++;
           } else apry++;
         }
       }
     }
     stackASize = d--;
     solveB(maxALength);
   } while (!isInterrupted && d >= 0);
 }
예제 #2
0
 private void searchB(final int maxALength, final int maxBLength) {
   stackB[0].length = 0;
   stackB[0].turnIndex = 0;
   int d = 0;
   do {
     while (stackB[d].length < maxBLength) {
       final BNode node = stackB[d];
       if (node.turnIndex >= node.turns.length) {
         if (--d < 0) return;
       } else {
         final Turn userTurn = node.turns[node.turnIndex++];
         node.userTurn = userTurn;
         final Turn cubeTurn = SymTransform.getTurn(userTurn, node.symmetry);
         node.cubeTurn = cubeTurn;
         final int length = node.length + metric.length(userTurn);
         if (cubeTurn.isB() && maxALength + length <= maxSearchLength && length <= maxBLength) {
           final BNode nextNode = stackB[d + 1];
           final int mep = transformB.mEdgePosTable.turn(cubeTurn, node.mEdgePos);
           final int cp = transformB.cornerPosTable.turn(cubeTurn, node.cornerPos);
           bprn++;
           if (bprn % CYCLES_BETWEEN_USER_CHECK == 0 && (isInterrupted = reporter.shouldStop()))
             return;
           final int mep_cp_d =
               pruneB.get_mEdgePos_cornerPos_dist(node.mEdgePos_cornerPos_dist, mep, cp);
           if (mep_cp_d <= maxBLength - length) {
             final int udep = transformB.udEdgePosTable.turn(cubeTurn, node.udEdgePos);
             final int mep_udep_d =
                 pruneB.get_mEdgePos_udEdgePos_dist(node.mEdgePos_udEdgePos_dist, mep, udep);
             if (mep_udep_d <= maxBLength - length) {
               nextNode.setCubeState(mep, cp, udep);
               nextNode.setDists(mep_cp_d, mep_udep_d);
               nextNode.setTurnState(node, userTurn, turnListB);
               nextNode.length = length;
               d++;
             } else bpry++;
           } else bpry++;
         }
       }
     }
     stackBSize = d--;
     display();
     maxSearchLength = maxALength + maxBLength - (findAll ? 0 : 1);
   } while (!isInterrupted && d >= 0);
 }