c – 我的数独求解器函数出了什么问题?

好吧所以我把我的功能改成了回溯功能(我在网上找到).它仍然从文件读取并将其输入数组,检查功能正常工作,所以我没有改变它.如果您想知道以下是我正在尝试解决的难题(其中零是空格).

0 5 0 0 2 0 0 7 0
7 2 0 4 0 3 0 0 0
9 0 0 0 5 0 6 2 0
0 0 5 0 8 6 0 0 0
1 0 0 0 4 0 0 0 8
0 0 0 2 3 0 4 0 0
0 9 3 0 1 0 0 0 2
0 0 0 3 0 2 0 4 6
0 8 0 0 0 0 0 1 0

// backtracking function
void Sudoku::solvePuzzle()
{
int x = 0;
int y = 0;
int r = 0;
bool back_flag;

while (r < 81) {
    back_flag = true; 
    x = r/9;
    y = r%9;

    for(int num = arr[x][y]; num < 10 && back_flag; num++) {

        if(check(x,y,num)) {
            arr[x][y] = num;
            back_flag=false;
            break;
        }
        else if(num >= 9) {
            arr[x][y] = 0;
        }
    }
    if(back_flag) {
        r--;
    }
    else {
        r++;
    }
}
}

解决方法

我不知道这些是否是唯一的错误,但乍一看,我认为不是

if (count == 1 && arr[r][c] == 0) {
         tempNum = num;
    }
    else {
        tempNum = 0;
    }
    count++;

它应该是

count++;
    if (count == 1) {
         tempNum = num;
    }

而不是

if (count == 1 && check(r,c,num) && arr[r][c] == 0) {
         arr[r][c] = tempNum;

它应该是

if (count == 1 && check(r,tempNum)) {
         arr[r][c] = tempNum;

要不就

if (count == 1 ) {
         arr[r][c] = tempNum;

因为,当count == 1时,如果你的checkfunction没有副作用,那么check(r,tempNum)不能为false.

顺便说一下,如果以这种方式组织代码,代码会更好读取:

for (int r = 0; r < MAX_ROW; r++) {
   for (int c  = 0; c < MAX_COL; c++) {
       if(arr[r][c] != 0)
           continue;

           // ** no tests for arr[r][c] == 0 in this code block any more
           // ...
    }
}

最后一件事:如果外循环中的零个数从一次迭代到下一次迭代不再变化,你应该停止算法,你的解算器会有SuDoKus无法解决,你不想让你的程序对于那些人来说,我想是无限循环.

相关文章

一.C语言中的static关键字 在C语言中,static可以用来修饰局...
浅谈C/C++中的指针和数组(二) 前面已经讨论了指针...
浅谈C/C++中的指针和数组(一)指针是C/C++...
从两个例子分析C语言的声明 在读《C专家编程》一书的第三章时...
C语言文件操作解析(一)在讨论C语言文件操作之前,先了解一下...
C语言文件操作解析(三) 在前面已经讨论了文件打开操作,下面...