这个数独求解器的实现是如何在不存储状态的情况下工作的
How does this implementation of Sudoku solver work in spite of not storing state?
此链接具有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
值,并尝试下一个可能的值。
这是一个蛮力解算器。你可能也想在谷歌上搜索一下。
希望这能有所帮助。
相关文章:
- 将字符串存储在c++中的稳定内存中
- QSqlquery prepare()和bindvalue()不工作
- std::原子加载和存储都需要吗
- C++:将控制台输出存储在宏中更好吗
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 使用QProcess执行命令,并将结果存储在QStringList中
- 访问存储在向量C++中的结构的多态成员
- 如何从存储在std::映射中的std::集中删除元素
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 我在一个生成随机数的程序工作,我想将这些数字存储在一个数组中
- OpenCV:文件存储操作员">>"在一个项目中工作,但不在另一个项目中工作(在同一类上)
- 简单的 CPP 地图存储和访问无法按预期工作
- 新建和删除如何工作以及它们的存储位置
- 通过OLE Automation从c++应用程序运行存储在Excel工作簿中的指定宏
- 这个数独求解器的实现是如何在不存储状态的情况下工作的