我正在创建一个创建随机数独表的控制台应用程序。
我在验证表时遇到问题(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()
函数中使用它们,这是我得到堆栈溢出错误的地方。
答案 0 :(得分:2)
首先,您的代码有几个基本的C ++问题:
int
的指针进行动态分配,其中分配的int
简单堆栈就足够了rand()
,加上模resulting in a very poor distribution,请考虑标准的<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 。
网上有很多确定性算法来生成数独表,你应该先看看它。
注意:强>
如果您非常幸运,您的程序可以生成有效的数独表。如果是,请考虑参加国家彩票。