public static String performIDAStar(char[] startState, boolean verbose) {
		// Don't bother wasting CPU cycles for an already solved Cube
		if (Arrays.equals(startState, Cube.GOAL.toCharArray())) {
			return "The given cube is already in a solved state";
		}
		// Initialize the root node with the start state
		CubeNode start = new CubeNode(startState, corners[Integer.parseInt(Cube.encodeCorners(startState))]);
		// And put the start node on the openSet
		if (verbose) {
			System.out.println("Beginning heuristic value: " + start.heuristic);
		}
		// Initialize nextBound with our starting heuristic value
		nextBound = start.heuristic;
		// Initialize nodesVisited
		nodesVisited = 0;
		// The end node once IDA* finishes
		CubeNode end = null;

		// Loop until we find a solution
		while (end == null) {
			if (verbose) {
				System.out.println("Current bound is: " + nextBound);
				System.out.println("# of Nodes visited: " + nodesVisited);
			}
			frontier.add(start);
			end = search(nextBound);
			// The iterative-deepening portion of IDA*
			// Increment the bound if we haven't found a solution
			nextBound++;
			// Reset the frontier and exploredSet
			frontier.clear();
			explored.clear();
		}
		if (verbose) {
			System.out.println("Solved!");
			System.out.println("Total # of nodes visited: " + nodesVisited);
		}
		return formatOptimalSolution(end.path);
	}