当前在产生多个解决方案方面存在问题,就我目前的功能而言,我只能产生一个解决方案。我可以对我的代码进行任何修改,以找出数独难题是否具有多个解决方案?
int Sudoku::solve(int sudokuboard[9][9]) {
int row, col;
if(!Sudoku::taken(sudokuboard,row,col)) {
return true;
}
for(int num =1;num <=9;++num) {
if(Sudoku::legal(sudokuboard,row,col,num)) {
sudokuboard[row][col]=num;
if(Sudoku::solve(sudokuboard))
return true;
sudokuboard[row][col]=0;
}
}
return false;
答案 0 :(得分:0)
我可以对我的代码进行任何修改,以找出数独难题是否具有多个解决方案吗?
您的代码不关心让 row,col 保持不变的位置,您不能这样做。
您需要尝试所有可能的方法,每次将一个数字都可递归地将数字1最多9放置在连续位置(0,0 0,1 .. 0,8 1,0 ...)在8,8上是一个解决方案
一种简单的方法(但由于对称/旋转而不是最有效的)是将网格作为类的成员,否则我并不真正了解拥有类而不只是C函数的兴趣:>
python-periphery
编译和执行:
.prettierignore
注意:这是我在the PROXY protocols中为C给出的解决方案的推论
答案 1 :(得分:0)
除了次优的性能和设计问题外,该代码几乎足以获得多种解决方案。
您需要做的是相对较小的更改:
if(Sudoku::solve(sudokuboard))
print(sudokuboard);
// no return.
// continue to the next possibility, as if the last selection failed.
sudokuboard[row][col]=0;
print
可以替换为save
或任何其他类型的解决方案。最好将处理操作传递给对象,例如对std::function
的引用。这样可以灵活地在运行时决定操作,而无需重复或修改任何代码。