public boolean solve() {
		Util.dprint("Solving process started");
		Util.dprint("Starting grid:");
		sudoku.print();

		// Sure hits
		solveSure(sudoku);
		if (sudoku.validateField()) {
			Util.dprint("Got it in one go! Result:");
			sudoku.print();
			return true;
		}
		
		// List possible options for remaining slots
		Util.dprint("We are out of sure hits.");
		sudoku.print();
		Util.dprint("Number of missing fields: " + Util.countEmptySlots(sudoku));
		Util.printMaybe(maybe);
		
		//Fill in the empty slots to the array
		for (Entry<Integer, ArrayList<Integer>> e : maybe.entrySet()) {
			emptySlots.add(e.getKey());
		}
		//set the try counter to 0
		for (int index : emptySlots) {
			tries.put(index, 0);
		}
		
		// Start guessing the remaining slots
		Util.dprint("Going to guess");
		try {
			solveGuess();
		} catch (StackOverflowError e) {
			Util.dprint("ERROR: STACKOVERFLOW");
		}
		Util.printMaybe(maybe);
		sudoku.print();
		
		// Final result
		Util.dprint("Number of Missing Fields: " + Util.countEmptySlots(sudoku));
		Util.dprint("Final product:");
		sudoku.print();
		return sudoku.validateField();
	}