软件工程—个人项目对于生成数独部分的总结
Posted fasl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了软件工程—个人项目对于生成数独部分的总结相关的知识,希望对你有一定的参考价值。
前几天忙着复习计组和软工考试了,断更了几天。
看到这个题目的时候起初感觉暴力做就OK了,但是回头看见一个1e6发现事情并不简单,数量是可以达到的(详见第一篇),但是细节上如果不到位的话,1e6数量级的数独是很难在短时间内输出的。再加上不能有重复的数独,所以难度就又增加了。
我查阅了一些资料。发现可以把第一行向右平移一定的位数,只要每一行平移的次数和之前的任意一行不一样,那么每一列也不会有重复的数字。接下来,考虑九宫格的不重复问题,我们只需要将每三行看成一组,组内向右移动都移动相差3的倍数个单位时就可以保证每宫内没有重复的数字。
这样做有几个好处,首先是生成的一定是数独,不用判定是不是数独。然后是没有重复数独。第一行不动,第二三行都可平移3或6个单位,我们记为036和063,456行的平移就很随意了,我们可以选择1,4,7三个数字自由组合就有了6种,789行选择2,5,8又有了6种,此时,对于每一个第一行排列就会有72种了,那么40320*720比1e6要大。
生成算法没有问题,然后是输出数独,由于在阅读相关博客时发现边生成边输出的方式实在太耗时间,所以采用了开大缓冲区的方法,先生成,然后一次性输出到文件中,最后发现输出时间很短,不足一秒。
至此数独生成问题解决。
相应代码稍后更新到GitHub上。
项目完成后会有一篇包含所有内容的总结博客。
以上是关于软件工程—个人项目对于生成数独部分的总结的主要内容,如果未能解决你的问题,请参考以下文章