个人项目:生成数独终局并求解
一.项目介绍及地址
GitHub:Sylph3/SoftwareEngineering
实现一个能够生成数独终局并且能求解数独问题的控制台程序。
二.PSP时间估计
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 90 | |
| Estimate | 估计任务需要多少时间 | 20 | |
| Development | 开发 | 2500 | |
| Analysis | 需求分析(新技术) | 400 | |
| Design Spec | 生成设计文档 | 60 | |
| Design Review | 设计复审 | 30 | |
| Coding Standard | 代码规范 | 10 | |
| Design | 具体设计 | 300 | |
| Coding | 具体编码 | 1200 | |
| Coding Review | 代码复审 | 200 | |
| Test | 测试 | 300 | |
| Reporting | 报告 | 410 | |
| Test Report | 测试报告 | 330 | |
| Size Measurement | 计算工作量 | 20 | |
| Postmortem&Process Improvement Plan | 事后总结,提出改进 | 60 | |
| 总计 | 3000 |
三.解题思路
1.生成数独
通过参考资料1,我了解到:每个数独终局,从第二行开始,每行分别是第一行右移3、6、1、4、7、2、5、8列的结果。规定左上角的格子中的数必为(学号后两位相加)%9+1,以我的情况为8,因此存在8!种终局;同时,每三行、每三列可以任意互换,因此4-6行/列,7-9行/列可进一步互换,共存在8!×3!×3!种终局。
2.求解数独
关于数独的求解,根据以往的经验,很容易就能想到用回溯法进行求解,即根据空结点的顺序遍历寻找数独的解。大致策略为:枚举尝试当前空格可以填入的数字,标记,进行下一空格的尝试,若该空格不可填入任何数字,说明之前的操作有误,回溯到上一级操作。重复该过程,直到没有空格,函数终止,找到相应解。考虑到这一算法可能较为耗时,可采取针对小九宫格等方式进行优化。
还有另一种方法是DLX算法2,即将数独问题转化为NP完全的精确覆盖问题,该算法在时间上取得了极大的优化。
四.设计实现
1.需求分析
(1)功能划分
程序要求的两项功能相互独立,因此,可以将该程序大致划分为以下几个模块:
- 命令行判断:命令行判断命令类型是生成数独还是求解数独,处理格式正确的参数,传参给相应模块;同时处理异常。
- 生成数独:在控制台输入指令“sudoku.exe -c n”,生成n个数独终局并按格式写入sudoku.txt文件。
- 求解数独:在控制台输入指令“sudoku.exe -s path”,求解文件路径path下文件中的数独题目,并将结果输出到sudoku.txt文件。
(2)功能建模
采用数据流图进行功能建模如下:
-
0层图
-
1层图
2.编码实现
(1)生成数独模块设计实现
(2)求解数独模块设计实现
(3)GUI界面设计实现
3.测试
五.程序改进
1.代码质量分析
2.性能分析
六.代码说明
1.生成数独
2.求解数独
3.GUI
七.时间统计
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 90 | 0 |
| Estimate | 估计任务需要多少时间 | 20 | 0 |
| Development | 开发 | 2500 | 0 |
| Analysis | 需求分析(新技术) | 400 | 0 |
| Design Spec | 生成设计文档 | 60 | 0 |
| Design Review | 设计复审 | 30 | 0 |
| Coding Standard | 代码规范 | 10 | 0 |
| Design | 具体设计 | 300 | 0 |
| Coding | 具体编码 | 1200 | 0 |
| Coding Review | 代码复审 | 200 | 0 |
| Test | 测试 | 300 | 0 |
| Reporting | 报告 | 410 | 0 |
| Test Report | 测试报告 | 330 | 0 |
| Size Measurement | 计算工作量 | 20 | 0 |
| Postmortem&Process Improvement Plan | 事后总结,提出改进 | 60 | 0 |
| 总计 | 3000 | 0 |