数独

需求分析
需求

​ 运行一个命令行程序,程序能:

1. 生成不重复的数独终局至文件。
2. 读取文件内的数独问题,求解并将结果输出到文件。
数据建模

​ 将数独分成9个宫进行求解,ER表示如下,因为数独左上角第一块确定,所以将其看作数独的属性。

功能建模

​ 数据源:用户

​ 数据终点:文件

​ 主要数据流:生成指令、求解指令、数独(待求解),以及终局

​ 主要支持文件:待求解数独文件

​ 主要处理过程:生成终局、求解数独

​ 0层图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ki08pYKS-1578925444947)(D:\Learn\Third\software Engineering\commit_edition\数据流图.png)]

​ 对系统进行求精,划分系统的子系统。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tv2L1pQ3-1578925444950)(D:\Learn\Third\software Engineering\commit_edition\数据流图1层.png)]

行为建模
解题思路

之前设计的算法是使用排除法和回溯结合,对每个位置都进行了回溯,并只对可能的解进行回溯。但在该回溯算法中,搜索时盲目的,效率较低,最差的实现对每个空方格试探所有可能的数字,有大量的时间浪费。并且如果需要生成多个终局时,每一个终局都是通过回溯实现,且生成不同的终局由Random()进行数字选择实现,但实际上Random生成伪随机数,在一定时间会生成相同随机数,无法保证在生成终局数目足够大时,不会产生两个相同的终局。

因为算法效率有很大的改进空间,以及无法保证在n足够大时,所有终局都相异,所以在对代码重构的过程中,引入了排列组合的算法,对原有进行优化。将数独分成9个3X3的小方块,每个小方块是一个宫。

img

​ 参考维基百科提供的一个生成终局思路,由第一宫生成其余八个宫。对第一宫中的块进行排列组合即可,因为生成终局时,要求左上角的第一个数为:(学号后两位相加)%9+1,(1+3)%9+1=5,所以左上角为5,且不允许改变。即在第一宫内只有八个块可以移动,有8!=40320种情况,并且在每一宫内(除了第一宫)进行列列变换有3!×3!×3!×3!=1296,第二宫和第三宫可以交换,第四宫和第七宫可以交换有2!×2!=4,总共可以生成209,018,880个终局(大于1,000,000),此方案可行。

​ 对于各种全排列,使用递归的方式实现。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值