数独问题求解二:解题思路(1)

数独问题求解二:解题思路(1)

初拿到任务,我对需求中的许多问题并没有太多思路,于此,我拿着题目在百度以及Google进行了搜索,很巧的是我找到了很多前人对该类项目的总结,这对我的解题有了很大的帮助,首先在此感谢之前写过的学长学姐。

首先对需求中的任务一步一步进行分析:

需求

1、
题目要求生成不重复的终局至文件,即首先要知道可生成的数独终局的上限,该问题在后面详述。
将终局输出至文件需要涉及到相关函数,该问题较为简单。
2、
读取文件内的数独,关键在于数独格式的读取,因为文件内数独格式固定且已知,只需要根据格式编写相关循环使得数据被读取时考虑到空格和换行即可。
求解为代码的主要部分,后边详述。
输出到文件涉及到函数较为简单。

生成终局

1、
这里提到了数独终局个数为1~1000000,即循环或递归的上限为1000000。
读取命令行数据较为简单。
2、
保存文件即相关函数。
关键在于数独格式,由于数独都是9×9,即只需要对中间前8个循环输出,第九个数特判即可。
3、
对于特殊情况的处理即判断输入是否为1~1000000整数即可。
4、
根据题意,我的学号后两位为37,计算得左上角的数为(3 + 7)% 9 + 1 = 2。
然后就是本题的关键——如何不重复生成数独终局。
分析数独游戏的规则:9×9的格子中填入1~9,要求每行每列不能有重复数字且,每个3×3格子中也不能有重复数字。
由于左上角的数字固定,即对数组进行了一定限制。
暂且先不考虑左上角的数字,假设我们已经有了一个数组终局,那么是不是只要依次对换该终局中的每一个数字,即可实现得到不同终局的目的。
固定第一行,由于第一个数字已知,即剩下的8个数字有8!种排列,其余的行里,如果调换2、3行,4至6行和7至9行,数独依然成立,这样总共有8!×3!×3!×2!种组合,大于最大要求,代码只需要进行排列的循环即可。

求解数独

1、
命令行及文件读取以及结果输出较易实现。
2、
读取文件中的数独格式,需要多种判断语句,但是整体格式比较简单易于实现。
特别注意记录0,即空格的位置。
3、
又是格式问题,无需多言。
4、
着重理解解数独问题,目前我的思路是用暴力搜索或者深度优先算法,爆搜不考虑时间代价的话是很简单实现的,抱着学习的态度我从网上以及YouTube上看了各路神仙对于解数独问题的思路,结合了POJ 2982,总结出来有回溯(深度优先),舞蹈链算法(DLX),候选数算法等,具体方法选择之后会说明。

最后附上我学习时的资料链接,也供后来人学习奇妙的数独解法(我觉得我以后看到数独都会想着怎么解了)
【1】https://zhuanlan.zhihu.com/p/31865810?utm_source=qq&utm_medium=social
【2】https://blog.csdn.net/shaowl111/article/details/86182451
【3】https://www.docin.com/p-1312980352.html
【4】https://www.ixueshu.com/document/cd7838079876fcad3ce48e4575ee1dd8318947a18e7f9386.html
附:
开发PSP2.1表格

PSP2.1Personal Software Process Stages预估耗时实际耗时
Planning计划3060
· Estimate· 估计这个任务需要多少时间3060
Development开发12001590
· Analysis· 需求分析(包括学习新技术)240240
· Design Spec· 生成设计文档9090
· Design Review· 设计复审(和同事审核设计文档)6060
· Coding Standard· 代码规范(为目前的开发制定合适的规范)9060
· Design· 具体设计120180
· Coding· 具体编码300600
· Coding Review· 代码复审120120
· Test· 测试(自我测试,修改代码,提交修改)180240
Reporting报告210210
· Test Report· 测试报告120120
· Size Measurement· 计算工作量3030
· Postmoterm & Process Improvement Plan· 事后总结,并提出过程改进计划6060
合计14401860
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值