生成数独终局

Posted ting-ting

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了生成数独终局相关的知识,希望对你有一定的参考价值。

本次个人项目是要求生成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指点。

 

以上是关于生成数独终局的主要内容,如果未能解决你的问题,请参考以下文章

个人项目解题思路

个人项目-数独终局生成与解数独

软件工程-个人项目 数独终局的一些想法

代码说明

软件工程数独——需求分析2

性能分析