private void solve(int[][] board, int cx, int cy, int ideal, int workers) 
	{
		FlipPuzzle flip = new FlipPuzzle( cx, cy, board );
		
		Solver<FlipMove> solver = workers <= 1 ? new Solver<FlipMove>() : new ConcurrentSolver<FlipMove>( workers );
		
		solver.setInitialState(flip);
		// Depth-First-Search
		solver.setBreadthFirst(false);
		// States will never be revisited
		solver.setRevisitStates(false);
		// Set to false to find all paths
		solver.setMinimalMoves(true);
		// Set to true so solutions can be backtracked
		solver.setSaveParent(true);
		// Restrict the minimal number of moves, I'm assuming the given board will take less.
		solver.setMaxDepth(ideal);
		// We only want a single solution.
		solver.setMaxSolutions(1);
		
		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());
		System.out.format("States too short: %d\n", solver.getStatesShort());
		
		List<FlipPuzzle> solutions = solver.getSolutions();
		
		System.out.format("Solutions: (%d) {\n", solutions.size());
		for (int i = 0; i < solutions.size(); i++) {
			System.out.format("Solution #%d took %d move(s).\n", i + 1, solutions.get(i).getDepth());
			print( solutions.get(i) );
		}
		System.out.println("}");
		System.out.println();
	}