Как работает эта реализация решателя судоку, несмотря на отсутствие сохранения состояния?

это ссылка имеет реализацию 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;
}
}

Пожалуйста, помогите мне понять эту деталь.

-2

Решение

Это является сохранение состояния: каждый рекурсивный вызов сохраняет состояние в стеке вызовов.

Неназначенные части сетки изменяются до тех пор, пока не будет найдено правильное решение. После этого все вызовы сгруппированных функций завершаются (строки 38 и 39), оставляя grid[][] в своем решенном состоянии. Если нет, то восстанавливает текущую ячейку UNASSIGNED значение и пытается следующее возможное значение.

Это решатель грубой силы. Возможно, вы захотите погуглить вокруг этого.

Надеюсь это поможет.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]