这个数独求解器的实现是如何在不存储状态的情况下工作的

How does this implementation of Sudoku solver work in spite of not storing state?

本文关键字:存储 工作 情况下 状态 实现      更新时间:2023-10-16

此链接具有Sudoku Solver算法的回溯实现。请注意,如果最初分配的值没有给出有效的输出,行号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值,并尝试下一个可能的值。

这是一个蛮力解算器。你可能也想在谷歌上搜索一下。

希望这能有所帮助。