递归验证函数堆栈溢出

时间:2014-08-15 20:35:56

标签: c++ validation stack-overflow sudoku

我正在创建一个创建随机数独表的控制台应用程序。

我在验证表时遇到问题(3x3盒子验证除外仍然需要工作),并且在9x9的xy循环很多之后很有效数据表我得到了堆栈溢出错误。我不知道如何阻止这种情况发生。

这是代码:

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();
}

我想我要使用动态内存分配,例如mallocnew?但是我不确定如何在validate()函数中使用它们,这是我得到堆栈溢出错误的地方。

1 个答案:

答案 0 :(得分:2)

首先,您的代码有几个基本的C ++问题:

  • 您正在使用指向int的指针进行动态分配,其中分配的int简单堆栈就足够了
  • 您使用的是来自C库的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

网上有很多确定性算法来生成数独表,你应该先看看它。

注意:

如果您非常幸运,您的程序可以生成有效的数独表。如果是,请考虑参加国家彩票。