27次运行后的StackOverflow

时间:2013-03-14 07:39:26

标签: stack-overflow sudoku

运行我的数独生成器时,27次堆栈溢出后。

void start(int todel){
int number;
for (int x=0; x<9; x++) {
    for (int y=0; y<9; y++) {

        number = GenN(x, y);
        osudoku[x][y]=number;
    }
}
replace(todel);
output();
}


int GenZ(int x, int y){
    int number;
    bool duplication = true;
    Randomize();
    number = Random(9)+1;
    duplication = check(number,x,y);
    if (duplication==true){
        return GenZ(x,y);
    }
    else if (duplication==false) {
        return number;
    }
}

我认为这是代码的一部分。 它产生的结果如下:

758 431 629 
913 267 485 
642 985 317
Stack Overflow

所以我得到1/3 Sudoku。

3 个答案:

答案 0 :(得分:2)

您需要在解决方案中添加backtracking

考虑这种情况:(可能在算法的某个时刻出现)

1 2 3 | 4 5 6 | 7 8 9
4 5 6 | 1 2 3 | ? _ _
...

您的程序会继续尝试查找适合?的值,但不存在此值。

相反,您的程序需要看到没有值适合,并为3尝试不同的值,这也不起作用,然后2,然后1在这种情况下它应该最终将789放在第二个块中,如:

1 2 3 | 4 5 6 | 7 8 9
4 5 6 | 7 8 9 | ? _ _
...

在这种情况下,它可以继续成功。

而且:

zahl = Random(9)+1;

不会真正起作用,因为您可能会继续获取不适合的值(如上例所示)。你不知道什么时候回溯。循环遍历所有9个值更好。在循环完所有9个值之后,你就会知道没有任何值适合你并且你知道你必须回溯。

答案 1 :(得分:0)

如果在GenZ中重复== true,它将使用相同的x,y再次调用它,这将再次产生重复== true?特别是因为我无法看到你修改“数字”,所以它的初始化值可能为0.

答案 2 :(得分:0)

if (duplication==true){
    return GenZ(x,y);
}

我不确定这是否是一种创建数据的可行方法,无论你如何实现它都可能需要一段时间,但你可以通过不使用递归和循环来摆脱stackoverflow错误

while (duplication){