【问题标题】:recursive validation function stack overflow递归验证函数堆栈溢出
【发布时间】:2014-08-15 20:35:56
【问题描述】:

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

我在验证表格时遇到了问题(除了仍然需要工作的 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() 函数中使用它们,这是我得到堆栈溢出错误的地方。

【问题讨论】:

  • C 不知道new。您需要使用malloc
  • 不是故意放C的,现在更正了@pzaenger
  • 不一致的缩进使这段代码难以阅读。

标签: c++ validation stack-overflow sudoku


【解决方案1】:

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

  • 您正在使用指向 int 的指针进行动态分配,其中简单的堆栈分配 int 就足够了
  • 您使用的是 C 库中的 rand(),加上模数 resulting in a very poor distribution,请考虑使用标准的 &lt;random&gt; 标头。
  • 您使用了不必要的全局变量 (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

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

注意:

如果你非常幸运,你的程序可以生成一个有效的数独表。如果是这样,请考虑玩国家彩票。

【讨论】:

    猜你喜欢
    • 2017-10-20
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    相关资源
    最近更新 更多