private void solve(int n, short[][] board) 
	{
		SudokuBoard sudoku = new SudokuBoard(n, board);

		System.out.format("Initial %d x %d Board {\n", n, n);
		System.out.print(sudoku);
		System.out.println("}");
		
		Solver<SudokuMove> solver = new Solver<SudokuMove>();
		solver.setInitialState(sudoku);
		// True since there can never be duplicate states
		solver.setRevisitStates(true);
		solver.solve();

		System.out.format("Solved in %d ms\n", solver.getSolveTime());
		System.out.format("States created: %d\n", solver.getStatesCreated());
		System.out.format("States visited: %d\n", solver.getStatesVisited());
		System.out.format("States duplicated: %d\n", solver.getStatesDuplicates());
		System.out.format("States pooled: %d\n", solver.getUniqueStates());
		System.out.format("States branched: %d\n", solver.getStatesDeviated());
		
		List<SudokuBoard> solutions = solver.getSolutions();
		
		System.out.format("Solutions (%d) {\n", solutions.size());
		for (int i = 0; i < solutions.size(); i++) {
			if (i > 0) System.out.println("AND ");
			System.out.print(solutions.get(i));
		}
		System.out.println("}");
		System.out.println();
	}