private void solve() {
    Node node1 = new Node(origBoard, 0, null);
    Node node2 = new Node(twin, 0, null);
    minPQOrig.add(node1);
    minPQTwin.add(node2);
    Node currentNode = node1;
    Node twinNode = node2;
    while (!currentNode.board.isGoal() && !twinNode.board.isGoal()) {
      if (minPQOrig.isEmpty()) {
        isSolvable = false;
        break;
      }
      if (!minPQTwin.isEmpty()) {
        twinNode = solveIteration(twinNode, minPQTwin);
      }
      currentNode = solveIteration(currentNode, minPQOrig);
    }
    if (twinNode.board.isGoal()) {
      isSolvable = false;
    } else {
      isSolvable = true;
      path = currentNode;
      makeStack();
    }
  }