我试图使用回溯来编码C中的数独求解器,但它在某些时候陷入困境。所有其他功能都运行良好,所以我似乎无法找到问题所在。该函数应该使用下一个数字作为参数来调用自身。返回其中一个值是有效的,当它不是时为零。这反过来应该引发回溯。它应该像这样工作,直到没有剩余的行。
输入:
5 3 X X 7 X X X X
6 X X 1 9 5 X X X
X 9 8 X X X X 6 X
8 X X X 6 X X X 3
4 X X 8 X 3 X X 1
7 X X X 2 X X X 6
X 6 X X X X 2 8 X
X X X 4 1 9 X X 5
X X X X 8 X X 7 9
预期产出:
5 3 4 | 6 7 8 | 9 1 2
6 7 2 | 1 9 5 | 3 4 8
1 9 8 | 3 4 2 | 5 6 7
- - - - - - - - - - -
8 5 9 | 7 6 1 | 4 2 3
4 2 6 | 8 5 3 | 7 9 1
7 1 3 | 9 2 4 | 8 5 6
- - - - - - - - - - -
9 6 1 | 5 3 7 | 2 8 4
2 8 7 | 4 1 9 | 6 3 5
3 4 5 | 2 8 6 | 1 7 9
我最终得到了什么:
5 3 1 | 2 7 6 | 4 9 8
6 2 4 | 1 9 5 | 7 3 0
0 9 8 | 0 0 0 | 0 6 0
- - - - - - - - - - -
8 0 0 | 0 6 0 | 0 0 3
4 0 0 | 8 0 3 | 0 0 1
7 0 0 | 0 2 0 | 0 0 6
- - - - - - - - - - -
0 6 0 | 0 0 0 | 2 8 0
0 0 0 | 4 1 9 | 0 0 5
0 0 0 | 0 8 0 | 0 7 9
这是回溯功能:
int solve(slot sudoku[9][9],int line, int column){
int num=1;
while(sudoku[line][column].fix==1){
column++;
}
if(line==9){
return 1;
}
for(num=1;num<10;num++){
if(Valid(line,column,num)){
sudoku[line][column].value=num;
if(column<8){
if(solve(sudoku,line,column+1)){
return 1;
}
}
else if(column==8){
if(solve(sudoku,line+1,0)){
return 1;
}
}
}
}
return 0;
}
这是我定义&#34; slot&#34;的方法。结构。它的目的是&#34; pin&#34;拼图的原始值,所以它不会覆盖它们。它通过分配&#34; 0&#34;可以通过该功能改变的插槽,以及&#34; 1&#34;到了要保持固定的插槽。
typedef struct slot{
int value;
int fix;
}slot;
如果有人能帮助我找到问题,我将非常感激。
答案 0 :(得分:1)
当列溢出数组大小时,您在此循环中或之后执行什么操作?
while(sudoku[line][column].fix==1)
{
column++;
}
当列溢出时,函数的其余部分使用该值,它作为参数传递给Valid()
,等等。
如果数字是固定的,那么您是否应该将其视为有效解决方案并返回0?
我没有在您的函数中看到将sudoku
- &gt;值设置为零的任何代码。
[edit]但是当列溢出时,您的函数返回0,而没有找到解决方案。我们看到的零是未初始化的值。