本次个人项目是要求生成1e6个数独终局。
首先说说数独的规则,数独的棋盘是一个9×9的格图,每3×3又是一个9宫格。
数独的要求是每行、每列、每个9宫格中,1~9这9个数字必须出现且仅出现一次。
对于每一个数独终局,我们只需把所有的一换成而或者其他的数字,就会生成一个新的数独终局,那么就有了9!种,但是要求中左上角的数字是不能动的,所以一个全新的数独“种子”通过8的全排列之后就能产生8!个数独终局,所以我们只需找到25个“种子”再通过数字变换即可得到1e6个数独终局。
下面是我的代码部分实现:
for(k=0;k<9;k++)
{
for(x=0;x<9;x++)
{
for(int j=1;j<9;j++)
{
if(shudu[temp][k][x]==j)
{
output[k][x]=str[i][j];
}
}
}
}
for(a=0;a<9;a++)
{
for(b=0;b<8;b++)
{
printf("%d ",output[a][b]);
}
printf("%d\n",output[a][8]);
}
printf("\n");
}
temp++;
if(temp*40320>N-1)
return 0;
因为没有直接运算,而是调换顺序来生成新的终局,所以效率很不错。
欢迎各位dalao指点。
原文地址:https://www.cnblogs.com/ting-ting/p/8850237.html