随机生成多个数独的程序问题

Love_Irelia97 2017-09-04 10:26:50



我写了个随机生成数独的程序,检验后可以生成,时间花费只有71ms。但当我写了循环准备生成多个数独时,发现即使我把数独数组初始化后,输出的数独数组全是一样的。我检查了算法中srand()的位置,确实位于循环之外,与之无关。

于是我重新记录了上一个数独数组第一个元素,然后新的数独先生成第一行,和第一行的第一个元素比较,相同则不执行算法。最后发现这样可以虽然生成n个不同的数独数组,但是时间花费却达到4.1s之多。我现在非常纳闷,这到底是怎么回事,有没有提高效率又能输出不同数独的办法?


...全文
426 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Love_Irelia97 2017-09-05
  • 打赏
  • 举报
回复
引用 3 楼 sdghchj 的回复:
把srand放在main开头啊
哈哈,我刚才也是这么做的,成功了,过来一看确实是这样,谢谢拉
sdghchj 2017-09-05
  • 打赏
  • 举报
回复
引用 2 楼 Love_Irelia97 的回复:
[quote=引用 1 楼 sdghchj 的回复:] srand在哪里? 不能放在循环体内以及循环体内的函数内,因为代码执行速度很快,即便你是在循环体内执行srand(time(0))时间种子基本不会改变导致伪随机数是一样的。
void sudoku_algorithm(int a[10][10])
{
	srand((unsigned)time(NULL));
	//sudoku_print(a);
			
	for (int row = 1; row <= 9; row++)
	{
		int fail_times = 0;					//	寻找当前行的解的次数
		for (int col = 1; col <= 9; )
		{
			if(fail_times > 1000)			//	寻找次数超过1000次,重置本行和上一行的元素为0
			{
				for (int i = 1; i <= 9; i++)
				{
					a[row][i] = 0;
					a[row-1][i] = 0;
				}
				row -= 2;		//	因为循环开头会+1,故此处先-2
				break;			//	重新寻找上一行的解
			}
			
			bool flag = sudoku_test(a, row, col);	//	判断a[row][col]是否能填数
			if(!flag)
			{
				col = 1;
				fail_times++;
				continue;
			}
								
			int  rand_num = rand() % 9 + 1;	//	随机数1 ~ 9

			bool flag1 = sudoku_row(a, row, col, rand_num);	//	判断行约束
			if (!flag1)
				continue;

			bool flag2 = sudoku_col(a, row, col, rand_num);	//	判断列约束
			if (!flag2)
				continue;

			bool flag3 = sudoku_mod(a, row, col, rand_num);	//	判断模块(宫)约束
			if (!flag3)
				continue;

			a[row][col++] = rand_num;
		}
		//	For Debug	//

		/*
		for (int i = 1; i <= 9; i++)
			printf("%d ", a[row][i]);
		printf("\n");
		*/
	}
}
放在这里,那么有没有什么解决方法呢[/quote] 把srand放在main开头啊
Love_Irelia97 2017-09-05
  • 打赏
  • 举报
回复
引用 1 楼 sdghchj 的回复:
srand在哪里? 不能放在循环体内以及循环体内的函数内,因为代码执行速度很快,即便你是在循环体内执行srand(time(0))时间种子基本不会改变导致伪随机数是一样的。
void sudoku_algorithm(int a[10][10])
{
	srand((unsigned)time(NULL));
	//sudoku_print(a);
			
	for (int row = 1; row <= 9; row++)
	{
		int fail_times = 0;					//	寻找当前行的解的次数
		for (int col = 1; col <= 9; )
		{
			if(fail_times > 1000)			//	寻找次数超过1000次,重置本行和上一行的元素为0
			{
				for (int i = 1; i <= 9; i++)
				{
					a[row][i] = 0;
					a[row-1][i] = 0;
				}
				row -= 2;		//	因为循环开头会+1,故此处先-2
				break;			//	重新寻找上一行的解
			}
			
			bool flag = sudoku_test(a, row, col);	//	判断a[row][col]是否能填数
			if(!flag)
			{
				col = 1;
				fail_times++;
				continue;
			}
								
			int  rand_num = rand() % 9 + 1;	//	随机数1 ~ 9

			bool flag1 = sudoku_row(a, row, col, rand_num);	//	判断行约束
			if (!flag1)
				continue;

			bool flag2 = sudoku_col(a, row, col, rand_num);	//	判断列约束
			if (!flag2)
				continue;

			bool flag3 = sudoku_mod(a, row, col, rand_num);	//	判断模块(宫)约束
			if (!flag3)
				continue;

			a[row][col++] = rand_num;
		}
		//	For Debug	//

		/*
		for (int i = 1; i <= 9; i++)
			printf("%d ", a[row][i]);
		printf("\n");
		*/
	}
}
放在这里,那么有没有什么解决方法呢
sdghchj 2017-09-05
  • 打赏
  • 举报
回复
srand在哪里? 不能放在循环体内以及循环体内的函数内,因为代码执行速度很快,即便你是在循环体内执行srand(time(0))时间种子基本不会改变导致伪随机数是一样的。

70,005

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧