运行我的数独生成器时,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。
答案 0 :(得分:2)
您需要在解决方案中添加backtracking。
考虑这种情况:(可能在算法的某个时刻出现)
1 2 3 | 4 5 6 | 7 8 9
4 5 6 | 1 2 3 | ? _ _
...
您的程序会继续尝试查找适合?
的值,但不存在此值。
相反,您的程序需要看到没有值适合,并为3
尝试不同的值,这也不起作用,然后2
,然后1
在这种情况下它应该最终将7
,8
和9
放在第二个块中,如:
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){