繁体   English   中英

递归验证函数堆栈溢出

[英]recursive validation function stack overflow

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

我在验证表时遇到了麻烦(除了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 ++问题:

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM