Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么';我的数独解算器功能有什么问题?_C++_Puzzle_Solver_Sudoku - Fatal编程技术网

C++ 什么';我的数独解算器功能有什么问题?

C++ 什么';我的数独解算器功能有什么问题?,c++,puzzle,solver,sudoku,C++,Puzzle,Solver,Sudoku,好的,我把我的函数改成了回溯函数(我在网上找到的)。它仍然从文件中读取并在数组中输入,check函数工作正常,所以我没有更改它。如果你想知道以下是我试图解决的难题(其中零是空白) 05020070 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 //回溯函数

好的,我把我的函数改成了回溯函数(我在网上找到的)。它仍然从文件中读取并在数组中输入,check函数工作正常,所以我没有更改它。如果你想知道以下是我试图解决的难题(其中零是空白)

05020070
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
//回溯函数
void数独::solvePuzzle()
{
int x=0;
int y=0;
int r=0;
布勒后旗;
而(r<81){
back_flag=true;
x=r/9;
y=r%9;
对于(int num=arr[x][y];num<10&&back\u flag;num++){
如果(检查(x,y,num)){
arr[x][y]=num;
back_flag=false;
打破
}
如果(num>=9),则为else{
arr[x][y]=0;
}
}
如果(返回_标志){
r--;
}
否则{
r++;
}
}
}

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

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

    count++;
    if (count == 1) {
         tempNum = num;
    }
    if (count == 1 && check(r, c, tempNum)) {
         arr[r][c] = tempNum;
而不是

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

    count++;
    if (count == 1) {
         tempNum = num;
    }
    if (count == 1 && check(r, c, tempNum)) {
         arr[r][c] = tempNum;
或者只是

    if (count == 1 ) {
         arr[r][c] = tempNum;
因为,当
count==1
时,那么
check(r,c,tempNum)
不能为false,前提是您的
check
函数没有副作用

顺便说一下,如果您这样组织代码,代码的可读性会更好:

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
           // ...
    }
}
for(int r=0;r

最后一件事:如果外循环中的零的数量在一次迭代到下一次迭代中不再改变,那么应该停止该算法,因为你的解算器将无法解决数独问题,我想你不想让你的程序陷入一个无休止的循环。

循环中会发生什么?我看不到任何会导致进展的循环。但是,由于我不知道应该采取什么措施来改进,所以我不能说错误在哪里。(数独的明显解决方案是使用递归和回溯——在一个通常少于10行的函数中。)您只实施了一种解决策略?即使正确地实现了这一点,您是否确定您的输入数独可以用这一种策略来解决?只有在执行较低循环中的
zeros++
时,循环才能终止。为此,
arr[r][c]
必须在您的注释//cout之前执行。所以我要在那里开始调试@詹姆斯:小心使用“明显的”。如果很明显,用户1053372不需要这个问题;-)@user1053372:您的问题最好在@talonmies处解决。check是一个检查并确保每行/col/3x3只有一个数字的函数。