数独生成求解器——软件工程2018年个人作业项目(完成)

这是一个使用C#编写的数独生成求解器项目,包含了需求分析、概要设计、详细设计和核心代码实现。项目采用瀑布模型开发,实现了数独终局生成、求解算法、随机数生成及输入输出功能。通过GitHub进行版本控制,包括对数独类的设计和单元测试。此外,还涉及性能分析和代码质量改进。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近更新时间2018.12.29(百忙之中实现了UI界面,另开了一篇)

GitHub连接:https://github.com/blingopen/sudoku

部分参考资料链接(有些参考之后忘记贴出来了):

内容目录

需求分析

概要设计

详细设计&核心代码实现

求解数独算法

生成终局函数

随机函数(生成随机数组)

输入输出函数

主函数

改进与提升!

性能分析与提高

单元测试

Sudoku类内测试

主函数测试

代码质量分析

        总结


 


此软件会用C#语言编写。 

首先我对这个数独项目完成的时间做了一个大致的估计。

psp2.1表格
PSP2.1

Personal Software

Process Stages

预估耗时(分钟) 实际耗时(分钟)
Planning 计划 60  
·Estimate ·估计这个任务需要多少时间 60  
Development 开发 1170  
· Analysis · 需求分析(包括学习新技术) 300  
· Design Spec · 生成设计文档 30  
· Design Review · 设计复审(和同事审核设计文档) 0  
· Coding Standard · 代码规范(为目前的开发制定合适的规范) 60  
· Design · 具体设计 180  
· Coding · 具体编码 300  
· Coding Review · 代码复审 120  
· Test · 测试(自我测试,修改代码,提交修改) 180  
Reporting 报告 360  
· Test Reporting · 测试报告 120  
· Size Measurement · 计算工作量 60  
· Postmortem & Process Improvement Plan · 事后总结,并提出过程改进计划 180  
  合计 1590  

本项目为个人项目,所以设计复审为本人自行复审(算在需求分析中),故和同行设计复审一栏时间花费为0.

需求分析

拿到题目之后我读了好几遍,终于把这个数独的需求摸索清楚了:

  1. 在控制台输入指令“sudoku.exe -c 有效数字”可以输出改有效数字数量的数独终局到txt文件中。
  2. 在控制台输入“sudoku.exe -s 绝对路径”可以读取绝对路径中txt文本中的数独,求解并输出结果到txt文件中。

首先计划了一番,计划的大致时间如上表,因为需求比较明确,并且功能没有很复杂,所以准备用瀑布模型来开发。

接着,我思考了一下,程序结构很简单,主要可分为以下几个板块,区分指令板块(包括不同的有效指令和无效指令),生成多个数独终局板块,求解数独板块,第一个板块直接在主函数中写一个判断就可以,后面两个板块要分别设计一些算法。

当然设计算法是后话,“工欲善其事,必先利其器”,要先把准备工作做好。所以先按照文档要求,创建一个优快云博客和GitHub工程文件夹,在这里寻求百度的帮助,查找了一些使用GitHub和Git的方法,配置好了相关环境,建立了相应的文件夹和博客。(前三次commit是试验自己是否创建成功

然后按照正常的瀑布模型开发流程,计划了大致时间后,写了一个需求分析,参考了网上的模板和教材的流程,存入了GitHub中(文件 Analysis.docx),其中建模结果大致如下。

 

数据建模

             本软件数据较为简单,抽象出来的实体只有一个完整的9×9的数独,和对应的每个3×3的小矩阵(共9个)。

图 1 sudoku系统初步ER图

功能建模

            数据源即用户,数据终点为本地计算机,主要数据流即用户在控制台应用输入的各种指令和输出结果,主要处理过程即生成终局和求解数独。(详细设计回来发现此处图有些不恰当

图 2 sudoku系统顶层DFD图

            继续划分,系统主要分为数独生成终局部分和数度求解部分,无法进一步精细化,故画到一层即可。

图 3 sudoku系统第1层DFD图

行为建模

          主要状态分为等待指令的主界面状态,生成终局状态,求解数独状态和错误信息状态,其行为关系如下:(详细设计回来发现此处图有些不恰当

数独算法说明:用三个二维数组记录数独每个点的状态,SD(i, j)显示数值,也是真实数值(1到9)。ST(i, j)状态,1可由用户输入,2是题目给定的,不能改。SY(i, j)这符串,记录每个点中可能的值。 1、在进行自动计算时,只计算ST(i, j)为1的点,首先将所有状态为1的点的SY(i, j)值全部设为"123456789",SD(i, j)值全部设为0 2、逐点扫描,找到一个点,然后将该点所在的行、列、区域中已存在的SD(x, y)值从SY(i, j)中删除,因为数独规则是一个数值,在行、列、区域都不重复。 3、经第二步处理后,SY(i, j)为空,说明题目错误,SY(i, j)值为一位数字,就说明该点的值是唯一的,可以确定了。 4、剩余的SY(i, j)值最少也是二个数字的,或更多位数。随机从这些两位数的SY(i, j)中选取一个点。取其中的一位确定为该点的值后,重复第2步。如果错误遇错,则重复执行第4步。直到所有点都被确定。 注意:第2步是需要多次重复执行的,所有可用递归函数完成。如果执行结果出现错误(某数出现重复,或某点无值),需要对该过程所执行的所有操作进行回退。 第4步也是需要重复执行的。本和序用Goto跳转方式实现多次执行。 简单的数独,要么所有的点都具有独一值,第1步执行完成后,就已全部完成。或者具有多个解,随意猜测一个二位数的SY(i, j)的值都能成功。 难的数独,是可唯一确定的点很少,大部分点都有两种或多种可能的值,但最终正确答案只有一种或很少种解。 软件在自动计算过程中,具有很大的偶然性,对于骨灰级的数独题目在计算过程中,时间短的可能不到1秒就能完成,长的可能要几分钟,需要将各种可能性都测试一遍才有结果。 只要题目正确,多计算几次就能得到答案。 程序只处理有两种可能值的情况,对只存在三种可能值的情况未进一步处理,该情况非常极端了。 软件中包含网上下载的200个数独题目。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值