[英]recursive validation function stack overflow
我正在创建一个创建随机数独表的控制台应用程序。
我在验证表时遇到了麻烦(除了3x3盒验证仍然需要工作),它可以正常工作,但是在9x9数独表的x
和y
循环了这么多之后,我得到了堆栈溢出错误。 我不确定如何阻止这种情况的发生。
这是代码:
int Array[9][9];
int validate(int i, int j, int *number){
*number = rand() % 9 + 1;
for (int x = 0; x < 9; x++){ //row validation
if (*number == Array[x][j]){
validate(i,j,number);
}
}
for (int x = 0; x < 9; x++){ //column validation
if (*number == Array[i][x]){
validate(i,j,number);
}
}
return *number;
}
void generate(){
for (int x = 0; x < 9; x++){
for (int y = 0; y < 9; y++){
int *number = new int;
Array[x][y] = validate(x,y,number);
delete number;
}
}
}
int main(){
srand((unsigned int)time(NULL));
generate();
}
我想我要使用动态内存分配,例如malloc
或new
? 但是我不确定如何在validate()
函数中使用它们,这是我收到堆栈溢出错误的地方。
首先,您的代码有几个基本的C ++问题:
int
指针,其中简单的堆栈分配的int
就足够了 rand()
加上模, 导致分布很差 ,请考虑使用标准<random>
标头。 Array
),应该避免这种情况。 现在,您真正的问题是数学 。
您正在尝试随机生成一个数独表:这不可能以确定性方式进行。
说明:
对于(i, j) in [1-9] x [1-9]
:
考虑单元格(i , j)
:对于该单元格,行上已经有i - 1
随机数,列上已经有j - 1
数字,即(i + j - 2)
数字。
现在,如果我们使i + j = 11
(例如i = 4, j = 7
),则在行或列上已经生成了9个随机数。 在某些情况下, [1 - 9]
中的所有数字都已存在于行或列中(代码中没有阻止它的情况),因此无法为当前单元格生成数字,因此无限递归( validate
方法)永远无法成功),因此Stack Overflow 。
Web上有很多确定性算法可以生成Sudoku表,您应该首先查看它。
注意:
如果非常幸运,您的程序可以生成有效的Sudoku表。 如果是这样,请考虑玩国家彩票。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.