一.项目介绍及地址
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层图
来源:CSDN
作者:HoperEdeiDeixai
链接:https://blog.csdn.net/Neubeginn/article/details/103811863