C数据求解器通过回溯卡住

时间:2017-06-29 21:37:00

标签: c backtracking

我试图使用回溯来编码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;

如果有人能帮助我找到问题,我将非常感激。

1 个答案:

答案 0 :(得分:1)

当列溢出数组大小时,您在此循环中或之后执行什么操作?

  while(sudoku[line][column].fix==1)
  {
        column++;
  }

当列溢出时,函数的其余部分使用该值,它作为参数传递给Valid(),等等。

如果数字是固定的,那么您是否应该将其视为有效解决方案并返回0?

我没有在您的函数中看到将sudoku - &gt;值设置为零的任何代码。

[edit]但是当列溢出时,您的函数返回0,而没有找到解决方案。我们看到的零是未初始化的值。