Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.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++_Recursion_Sudoku_Backtracking - Fatal编程技术网

C++ 用于多个解决方案的数独解算器-缺少解决方案

C++ 用于多个解决方案的数独解算器-缺少解决方案,c++,recursion,sudoku,backtracking,C++,Recursion,Sudoku,Backtracking,我已经完成了大部分程序,但当我尝试使用一个部分填充的数独游戏时,它应该有8个解决方案,它打印出的解决方案应该少一个。以下是我查找所有备选方案的功能: void guess(Puzzle *puzzle, list<Puzzle> *solutions, stack<Puzzle> *alternatives) { int i, j, x; while(!(*puzzle).isSolved(i, j)) { for(x =

我已经完成了大部分程序,但当我尝试使用一个部分填充的数独游戏时,它应该有8个解决方案,它打印出的解决方案应该少一个。以下是我查找所有备选方案的功能:

void guess(Puzzle *puzzle, list<Puzzle> *solutions, stack<Puzzle> *alternatives)
{    
    int i, j, x;

    while(!(*puzzle).isSolved(i, j))
    {
        for(x = 1; x <= 9; ++x)
        {
            if((*puzzle).checkCell(i, j, x))
            {
                (*puzzle).assign(i, j, x);

                Puzzle alternative;
                alternative.initialize(&(*puzzle));

                if(solve(&alternative1))
                {
                    (*solutions).push_back(alternative);
                    (*alternatives).push(*puzzle);
                } // if
            } // if
        } // for

        (*puzzle).initialize(&(*alternatives).top());
        (*alternatives).pop();
    } // while
} // guess
仅当单元格i、j为空时才检查它们。函数isSolved获取i,j,并将空单元格编号i和j放入i,j中,这样当程序猜测时,它只猜测空单元格

这是我的函数solve,它为从guess传入的每个给定部分填充的谜题求解一个单一解:

bool solve(Puzzle *alternative)
{
    int i, j, x;

    if((*alternative).isSolved(i, j))
        return true;

    for(x = 1; x <= 9; ++x)
    {
        if((*alternative).checkCell(i, j, x))
        {
            (*alternative).assign(i, j, x);
            if(solve(alternative))
                return true;
            (*alternative).assign(i, j, 0);
        } // if
    } // for

    return false;
} // solve()
下面是我尝试过的部分填充数独: .8…9743.5…8.1…1…8…5…8.4…3…6…7…3.5…8.9724…5

我的程序可以很好地处理大多数谜题,除非它用于查找多个解决方案,否则它往往会错过一个或两个解决方案。请帮忙

什么是拼图::isSolvedint,int?i和j在while语句中使用之前没有初始化。@AviGinsburg:我想布尔拼图::isSolvedint&,int&。影响i,j到第一个空单元坐标。