数独问题求解二:解题思路(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.1 | Personal Software Process Stages | 预估耗时 | 实际耗时 |
---|---|---|---|
Planning | 计划 | 30 | 60 |
· Estimate | · 估计这个任务需要多少时间 | 30 | 60 |
Development | 开发 | 1200 | 1590 |
· Analysis | · 需求分析(包括学习新技术) | 240 | 240 |
· Design Spec | · 生成设计文档 | 90 | 90 |
· Design Review | · 设计复审(和同事审核设计文档) | 60 | 60 |
· Coding Standard | · 代码规范(为目前的开发制定合适的规范) | 90 | 60 |
· Design | · 具体设计 | 120 | 180 |
· Coding | · 具体编码 | 300 | 600 |
· Coding Review | · 代码复审 | 120 | 120 |
· Test | · 测试(自我测试,修改代码,提交修改) | 180 | 240 |
Reporting | 报告 | 210 | 210 |
· Test Report | · 测试报告 | 120 | 120 |
· Size Measurement | · 计算工作量 | 30 | 30 |
· Postmoterm & Process Improvement Plan | · 事后总结,并提出过程改进计划 | 60 | 60 |
合计 | 1440 | 1860 |