Github项目地址
https://github.com/JackManTvO/sudoku
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 12 |
Estimate | 估计这个任务需要多少时间 | 20 | 12 |
Development | 开发 | 520 | |
Analysis | 需求分析(包括学习新技术) | 120 | |
Design Spec | 生成设计文档 | 30 | |
Design Review | 设计复审(和同时审核设计文档) | 20 | |
Coding Standard | 代码规范(为目前的开发制定合适的规范) | 20 | |
Design | 具体设计 | 60 | |
Coding | 具体编码 | 180 | |
Code Review | 代码复审 | 30 | |
Test | 测试(自我测试,修改代码,提交修改) | 60 | |
Reporting | 报告 | 100 | |
Test Report | 测试报告 | 60 | |
Size Measurement | 计算工作量 | 10 | |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 30 | |
合计 | 640 |
解题思路
生成数独终局
数独的要求是在9×9的格子内,每一行和每一列和每一宫内都包含不重复的九个元素,但数独终局的个数共有6,670,903,752,021,072,936,960(6.67×10²¹)种组合,尽管终局要求左上角第一个数字为固定值,其终局的种数也是巨大的。而程序设计对终局数量的需求仅在1,000,000个以内,因此,没有必要穷举找到前1,000,000种终局,而没有合适的生成策略随机生成则可能造成终局的重复。因此需制定合适的生成终局策略,而我的生成终局策略为对固定的终局模板进行数字交换以及行交换。这种策略共可以生成8!(除首数字外8个数字两两交换)×2(23行交换)×6(4~6行两两交换)×6(7~9行两两交换)=2,903,040种终局,大于要求的终局数。
具体步骤如下:
1.生成一固定的有效终局作为模板。
2.对模板进行数字交换。
3.对进行数字交换后的终局进行行交换(2~3行交换、4~6行交换、7~9行交换)保证宫内不重复。
4.若生成终局数满足程序要求个数即返回,若不满足,重复进行步骤2、步骤3。
求解数独谜题
对于给定的数独谜题,按要求补充数独的空缺,以完成数独。因为填入的数需要满足数独的要求,所以每个固定位置的数值是有限制的,在剩余的可行值中选择一个填入空白,接着填入下一个空白。若发现无可行解,则父节点选择错误,采用回溯法,返回上一节点,填入另一可行解。直到生成树的层数等于空缺数,则生成一可行的数独终局,求解数独谜题成功。
具体步骤如下:
1.扫描题目,将空白值坐标取出存入数组A。
2.在数组A中选择下一个坐标。
3.查询其所在行、列、宫的数值,填入可行解数组,在可行解数组中选取下一可行解填入。
4.若填入成功,则返回步骤2,若无可行解,则在数组A中返回上一坐标,返回步骤3填入另一可行解。若A中无剩余,则返回,求解数独成功。