Я борюсь с алгоритмом возврата, чтобы определить, имеет ли судоку уникальное решение или несколько решений. Вот код возврата, который я использую:
static boolean solve(int i, int j, int[][] cells) {
if (i == 9) {
i = 0;
if (++j == 9)
return true;
}
if (cells[i][j] != 0) // skip filled cells
return solve(i+1,j,cells);
for (int val = 1; val <= 9; ++val) {
if (legal(i,j,val,cells)) {
cells[i][j] = val;
if (solve(i+1,j,cells))
return true;
}
}
cells[i][j] = 0; // reset on backtrack
return false;
}
Первый подход: если я изменюсь
for (int val = 1; val <= 9; ++val) {
for (int val = 9; val >= 1; val--) {
я получаю два разных алгоритма решения, которые должны находить разные решения (если существуют разные решения). Проблема с этим подходом заключается в том, что алгоритм не завершается, хотя это всего лишь небольшое изменение, и я не знаю, почему.
Второй подход: сбросить, чтобы вернуться и продолжить поиск решения. Если я попробую это, это тоже не сработает.
Я пытался найти пример Java, но могу найти только такую информацию, как «сбросить при возврате и продолжить поиск второго решения».
Может ли кто-нибудь привести пример, как изменить алгоритм, чтобы он сообщал мне, существует ли несколько решений (точное число не требуется)
OR
Может кто-нибудь объяснить мне, почему мой первый подход не заканчивается?
Спасибо!