это ссылка имеет реализацию Backtracking алгоритма Судоку Солвер. Обратите внимание, что строка 42 изменяет значение, первоначально присвоенное ячейке, на другое значение, если первоначально назначенное значение не дало правильного вывода.
Однако я не понимаю, насколько достаточно просто изменить значение одной ячейки. Этот звонок мог вызвать много других звонков, и так как массивы (матрицы) передаются по памяти (ссылка), она не сохраняет копию матрицы (grid [N] [N]) при каждом вызове рекурсивной функции и поэтому изменяется до тех пор, пока базовый случай рекурсии не отразится даже в первом кадре рекурсии к тому времени, когда она вернется. назад.
По моему мнению, непосредственно перед вызовом рекурсивной функции вы должны сделать временную копию grid [N] [N] и восстановить ее, как только вызов будет возвращен, и до вызова следующей функции в том же кадре.
Что-то вроде
for (int num = 1; num <= N; num++)
{
// if looks promising
if (isSafe(grid, row, col, num))
{
//save grid state
int[][] temp = new int[N][N];
save(temp,grid); //copy all values from grid to temp
// make tentative assignment
grid[row][col] = num;
// return, if success, yay!
if (SolveSudoku(grid))
return true;
//restore grid state
restore(temp,grid); //copy all values from temp back to grid
// failure, unmake & try again
grid[row][col] = UNASSIGNED;
}
}
Пожалуйста, помогите мне понять эту деталь.
Это является сохранение состояния: каждый рекурсивный вызов сохраняет состояние в стеке вызовов.
Неназначенные части сетки изменяются до тех пор, пока не будет найдено правильное решение. После этого все вызовы сгруппированных функций завершаются (строки 38 и 39), оставляя grid[][]
в своем решенном состоянии. Если нет, то восстанавливает текущую ячейку UNASSIGNED
значение и пытается следующее возможное значение.
Это решатель грубой силы. Возможно, вы захотите погуглить вокруг этого.
Надеюсь это поможет.
Других решений пока нет …