Когда вы находите первое решение, вы устанавливаете флаг, но возвращаете false, чтобы вы не знали, было ли решение найдено дальше по стеку рекурсии. Флаг говорит вам об этом, но вы все равно должны искать второе решение, чтобы получить ответ.
Вы должны различать guish между фактическим поиском решения, когда достигнута последняя ячейка, и сокращением рекурсии когда вы уже нашли второе решение. В первом случае выполните отсроченный отсчет с помощью флага. Во втором случае просто верните true, если было найдено второе решение, то есть когда рекурсивная функция вернула true.
boolean solutionFlag = false;
static boolean multiSolution(int startIndex) {
for (int i = 1; i <= sudokuGridElements.length; i++) {
sudokuGridCells[startIndex] = i;
if(checkConditons()) {
if (endOfBounds) {
if (solutionFlag) return true;
solutionFlag = true;
} else {
if (multiSolution(startIndex + 1)) return true;
}
}
sudokuGridCells[startIndex] = null;
}
return false;
}
(Вы можете избавиться от нелокального флага состояния, если вы сделали функция возвращает целочисленное или перечисляемое значение, которое сообщает вам, были ли найдены одно или несколько решений.)