Примечание: эта проблема была решена, реальная проблема заключается НЕ в этом методе, а в другом, поэтому, если вы ищете что-то о судоку и, наконец, попали на эту страницу, вы можете абсолютно использовать мой метод ниже, он работает.
Хорошо, забудьте обо всех сложных алгоритмах, используемых для решения судоку. Я пишу простой решатель на Java для решения простых игр судоку. Идея этого метода очень распространена, поэтому я думаю, что все ее уже знают. Я также удивлен, что не могу этого сделать.
Метод состоит в том, чтобы пройти по каждой ячейке на доске и заполнить все ячейки, в которых есть только одна возможность. Повторяйте, пока все ячейки не будут заполнены. Очень просто, и вот мой код, можно сделать return int количество заливок:
public int solveGame() {
/*
variable possible contains 10 elements, the first element is true if there
is one or more possible value to fill in, false otherwise. The remaining
elements (1-9) are whether true or false depending on their indexes
e.g. possible[3] is true if 3 is a possibility.
*/
boolean[] possible;
int[] save;
int count;
int numresolve = 0;
while (!isFinished()) {
for (int i = 0; i < GAMESIZE; i++) {
for (int j = 0; j < GAMESIZE; j++) {
possible = new boolean[10];
possible = getPossible(i,j);
if (possible[0]) {
count = 0;
save = new int[9];
for (int k = 1; k < 10; k++) {
if (possible[k]) {
count++;
save[count] = k;
}
}
if (count == 1) {
setCell(i,j,save[count]);
numresolve++;
}
}
}
}
}
return numresolve;
}
Проблема моего кода в том, что он никогда не может завершить цикл, потому что после заполнения всех ячеек, которые имеют 1 возможность, оставшиеся ячейки будут иметь более 1 возможности, что невозможно для завершения цикла.
Я знаю, что упускаю то, о чем не могу думать.
count
будет9
, и, таким образом, вы получаете доступ к элементу массиваsave[9]
, который не существует (сохранение было инициализировано какint[9]
). - person Howard   schedule 21.05.2011