Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.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
Recursion 递归数独解算器-分段错误(C+;+;)_Recursion_Segmentation Fault_Sudoku - Fatal编程技术网

Recursion 递归数独解算器-分段错误(C+;+;)

Recursion 递归数独解算器-分段错误(C+;+;),recursion,segmentation-fault,sudoku,Recursion,Segmentation Fault,Sudoku,为了学习使用递归,我正在尝试制作一个数独解算器。我似乎已经让大部分代码都能很好地协同工作,但是当我运行程序时,我收到一个windows错误,告诉我程序已经停止工作。调试表明存在分段错误,我在其他地方看到,这可能是由太多的递归引起的。我知道这是一个蛮力的方法,但再一次,我更担心的是让它发挥作用,而不是速度。我可以做些什么来将其修复到工作级别 struct Playing_grid { //Value of cell int number; //wether the numb

为了学习使用递归,我正在尝试制作一个数独解算器。我似乎已经让大部分代码都能很好地协同工作,但是当我运行程序时,我收到一个windows错误,告诉我程序已经停止工作。调试表明存在分段错误,我在其他地方看到,这可能是由太多的递归引起的。我知道这是一个蛮力的方法,但再一次,我更担心的是让它发挥作用,而不是速度。我可以做些什么来将其修复到工作级别

struct Playing_grid {
    //Value of cell
    int number;
    //wether the number was a clue or not
    bool fixed;
}
grid[9][9];

    void recursiveTest(int row, int column, int testing)
    {
    //first, check to make sure it's not fixed
        if(grid[row][column].fixed == false)
        {
            if((checkRow(testing, row) | checkColumn(testing, column) | checkBox(testing,boxNumber(row,column)) | (testing > 9)) == 0)
            {
                grid[row][column].number = testing;
                moveForward(row,column,testing);
                recursiveTest(row, column, testing);
            }
            else if(testing < 9)
            {
                testing ++;
                recursiveTest(row, column, testing);
            }
            else if(testing == 9)
            {
                while(testing == 9)
               {
                moveBack(row,column,testing);
                while(grid[row][column].fixed == true)
                {
                    {
                        moveBack(row,column,test);
                    }
                }
                testing = grid[row][column].number;
                recursiveTest(row,column,testing);
               }
            }
        }
        else
        {
            moveForward(row,column,testing);
            recursiveTest(row,column,testing);
        }
    }



     void moveForward(int& row, int& column, int& test)
{
    if(column < 8)
    {
        column ++;
    }
    else if((column == 8) & (row != 8))
    {
        column = 0;
        row ++;
    }
    else if((column == 8) & (row == 8))
    {
        finishProgram();
    }
    test = 1;
}

    void moveBack(int& row, int& column, int& test)
    {
        grid[row][column].number = 0;
        if(column > 0)
            {
                column --;
            }
        else if((column == 0) & (row > -1))
            {
                column = 8;
                row --;
            }
        else
        {
            cout << "This puzzle is unsolveable!" << endl;
        }
        test++;
    }
struct\u网格{
//细胞价值
整数;
//这个号码是不是线索
布尔固定;
}
网格[9][9];
void recursiveTest(int行、int列、int测试)
{
//首先,检查以确保它没有被修复
if(网格[行][列].fixed==false)
{
if((检查行(测试,行)|检查列(测试,列)|复选框(测试,箱号(行,列))|(测试>9))=0)
{
网格[行][列].编号=测试;
向前移动(行、列、测试);
递归测试(行、列、测试);
}
否则如果(测试<9)
{
测试++;
递归测试(行、列、测试);
}
否则如果(测试==9)
{
while(测试==9)
{
回移(行、列、测试);
while(网格[行][列].fixed==true)
{
{
回移(行、列、测试);
}
}
测试=网格[行][列].编号;
递归测试(行、列、测试);
}
}
}
其他的
{
向前移动(行、列、测试);
递归测试(行、列、测试);
}
}
无效向前移动(int&row、int&column、int&test)
{
如果(列<8)
{
列++;
}
else如果((列==8)和(行!=8))
{
列=0;
行++;
}
else如果((列==8)和(行==8))
{
finishProgram();
}
测试=1;
}
无效回移(int&row、int&column、int&test)
{
网格[行][列].number=0;
如果(列>0)
{
列--;
}
else if((列==0)和(行>-1))
{
列=8;
行--;
}
其他的
{

cout我通常会尝试修复您的代码,但我认为在这种情况下,它存在根本性的缺陷,您需要回到绘图板

一般来说,像这样的递归函数的伪代码是

For each possible (immediate) move
  Perform that move
  Check for win state, if so store/output it and return true.
  Call this function. If it returns true then a win state has been found so return true 
  Otherwise unperform the move
Having tried every move without finding a win state, return false.

关于分段错误,调试器告诉了您什么?我不熟悉C语言(我假设这是C语言),但快速浏览一下,因为伪代码您的算法似乎有缺陷。我看不到通过recursiveTest的方法,它本身不调用recursiveTest,这意味着它将无限递归。您需要让一些调用完成,以便它们可以脱离堆栈。作为一般规则,我希望只在单元格t之后直接调用moveBacko递归测试;在while循环中不重复。关于分段错误,我得到的只是一条“Program received signal SIGSEGV,segmentation fault”(程序接收信号SIGSEGV,分段错误)消息。我不知道如何获得有关该消息的更多信息。我忘了在moveForward循环中实现一个部分-当它到达网格中的最后一个空间时(8,8)它是有效的,我让它保存并输出完成的拼图。另外,while循环检查前一个单元格的固定值,并继续检查,直到它达到未知的值。这基本上是我(感知)的版本,你所说的-但是,我找不到一个“取消执行”的好方法移动,这就是它变得如此混乱的原因。撤消/转到以前的状态有什么好方法?@BenjaminGoodberry将“光标”移回上一个单元格是撤消移动的完全合理的方法,但是一般来说,您的代码结构甚至不像我在这里建议的那样遥远。我会认真地删除所有代码在该函数中,然后重新开始。另外,删除测试参数;这是检查每个可用移动时应该循环使用的参数。我个人也会删除x和y,并将它们作为类的属性,但这更符合个人偏好。(顺便说一句,我现在要睡觉了,所以如果我不尽快回复,那不是因为我忽略了你,而是我明天早上会回来查看)