【个人项目数独】2、需求分析与思考

需求分析

我们都多少了解过数独游戏,数独是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫(3*3)内的数字均含1-9,不重复。数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次。
根据项目文档来看,需求是很明确的,即:①生成不重复的指定数量的数独终局、②求解数独。

思考

1、生成数独

要说是解数独的方法我倒是听说过不少,可这突然要求生成数独终局可真有点难到我了,更何况题目要求能生成100万个不重复的数独终局,还需要在六十秒内完成,这对方法的要求就更加严格,显然暴力法是不能采用的。
根据要求首先左上角的数字要固定为9,然后经过仔细思考,根据经验可以猜测这种数学游戏通常都是有规律可循的,然后便查阅了一番资料,果不其然,对于一个待定的数独终局,在第一行确定的情况下。只要保证从第二行开始,每一行的数字分别是第一行数字右移3、6、1、4、7、2、5、8位,那么所得到的9×9的数独终局结果便满足要求。实际上这里运用的是数论同余的原理,每三行的位移量属于mod 3的同余类,实际上只要三行位移量在同一mod 3同余类的不同值就可以了。
那么由此,只需要构造数独终局的第一行,然后由其构造剩下的八行。在第一个数字确定的情况下,第一行剩下8个数字进行全排列,则有8!=40320种结果,然后,对于数独终局的每三行,任意交换后所得到的结果仍然是满足要求的,那么对于每一个终局,就可以得到2×6×6=72种结果,则一共可以有72×40320=2903040种结果,已经达到了题目要求。

2、求解数独

对于数独的求解,很容易想到的就是深度优先搜索的暴力求解,以前求解迷宫常常用到这种方法,这种方法代码比较简单,但是效率会低一些。不过这道题目并没有对求解数独方面做出过多的性能要求,如果再配合一些剪枝算法,相信结果应该还可以。
此外,舍友提醒我再判断每行每列每个九宫格的数字是否重复时,可以采用位运算的方法,可以大大提高程序的效率。

以后有机会的话可以尝试一下Dancing Links X算法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值