Я надеюсь оптимизировать мой алгоритм обратного отслеживания для моего решения Sudoku.
Что он делает сейчас:
Рекурсивная решающая функция принимает головоломку судоку с различными заданными значениями.
Я просмотрю все пустые слоты в головоломке, ища слот, который имеет наименьшие возможности, и получите список значений.
Из списка значений я прокручу его, поместив одно из значений из списка в слот и рекурсивное решение, до тех пор, пока вся сетка не будет заполнена.
Эта реализация по-прежнему занимает невероятно долгое время для некоторых головоломок, и я надеюсь еще больше ее оптимизировать. У кого-нибудь есть идеи, как я могу еще больше оптимизировать это?
Вот мой код на Java, если вам интересно.
public int[][] Solve(int[][] slots) {
// recursive solve v2 : optimization revision
int[] least = new int[3];
least[2] = Integer.MAX_VALUE;
PuzzleGenerator value_generator = new PuzzleGenerator();
LinkedList<Integer> least_values = null;
// 1: find a slot with the least possible solutions
// 2: recursively solve.
// 1 - scour through all slots.
int i = 0;
int j = 0;
while (i < 9) {
j = 0;
while (j < 9) {
if (slots[i][j] == 0) {
int[] grid_posi = { i, j };
LinkedList<Integer> possible_values = value_generator
.possibleValuesInGrid(grid_posi, slots);
if ((possible_values.size() < least[2])
&& (possible_values.size() != 0)) {
least[0] = i;
least[1] = j;
least[2] = possible_values.size();
least_values = possible_values;
}
}
j++;
}
i++;
}
// 2 - work on the slot
if (least_values != null) {
for (int x : least_values) {
int[][] tempslot = new int[9][9];
ArrayDeepCopy(slots, tempslot);
tempslot[least[0]][least[1]] = x;
/*ConsoleInterface printer = new gameplay.ConsoleInterface();
printer.printGrid(tempslot);*/
int[][] possible_sltn = Solve(tempslot);
if (noEmptySlots(possible_sltn)) {
System.out.println("Solved");
return possible_sltn;
}
}
}
if (this.noEmptySlots(slots)) {
System.out.println("Solved");
return slots;
}
slots[0][0] = 0;
return slots;
}