数独求解器(无法获取多个解决方案)

时间:2019-04-01 16:04:14

标签: c++

当前在产生多个解决方案方面存在问题,就我目前的功能而言,我只能产生一个解决方案。我可以对我的代码进行任何修改,以找出数独难题是否具有多个解决方案?

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;

2 个答案:

答案 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的引用。这样可以灵活地在运行时决定操作,而无需重复或修改任何代码。