private SudokuGrid iteratePartialSolution(int row, int column, SudokuGrid sudokuGrid) { if (row >= 9) { return sudokuGrid; } iterationCounter++; int newColumn = (column + 1) % 9; int newRow = row + (newColumn == 0 ? 1 : 0); if (sudokuGrid.getFieldValue(row, column) == 0) { for (byte value = 1; value <= 9; value++) { // printDebugInfo(row, column, value); SudokuGrid newSudokuGrid = sudokuGrid.setFieldValue(row, column, value); if (validateSudokuForField(row, column, newSudokuGrid)) { SudokuGrid resultSudokuGrid = iteratePartialSolution(newRow, newColumn, newSudokuGrid); if (resultSudokuGrid != null) { return resultSudokuGrid; } } sudokuGrid.resetFieldValue(row, column); } } else { return iteratePartialSolution(newRow, newColumn, sudokuGrid); } return null; }