0

运行我的数独生成器时,经过 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 的数独。

4

3 回答 3

2

您需要在解决方案中添加回溯

考虑这种情况:(可能在您的算法中的某个时刻发生)

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

您的程序将继续尝试找到适合 的值?,但不存在这样的值。

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

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

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

还有这个:

zahl = Random(9)+1;

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

于 2013-03-14T07:56:03.383 回答
0

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

于 2013-03-14T07:42:45.537 回答
0
if (duplication==true){
    return GenZ(x,y);
}

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

while (duplication){
于 2013-03-14T07:42:49.550 回答