【第一篇】数独终局

隐身守侯 提交于 2020-01-12 12:02:20

一.项目介绍及地址

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层图
    0层图
  • 1层图
    1层图

  1. https://www.cnblogs.com/BIT1120161931/p/8618878.html
    ↩︎

  2. http://blog.gssxgss.me/use-dlx-to-solve-sudoku-1/ ↩︎

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!