软工实践第二次作业

软件工程实践第二次作业
github链接

解体思路

一开始拿到题目,没有仔细往后看,把题目当作解数独了。
解数独的话,一开始就想到大一好像写过八皇后,也是有约束条件,然后深度搜索解决。
但是想看看有没有什么优化,结果是看到了这篇博文数独解法小探,里面用了五种方法:回溯法,排列组合法,精确覆盖问题法,模拟退火法以及约束编程法,看着看着就发呆了==。在这个页面上一脸懵逼了好久,后来发现题目看错了,就跑去想怎么解决题目,就没有继续看解数独了,现在还是懵逼中...
要生成数独矩阵的话,其实一开始也是想到,可以用解数独的方法来生成数独,一个个判断过去,不行就回溯。因为前面写过解数独的回溯,所以生成数独的回溯算法就很好理解了。
查找资料的过程中,看到了《编程之美》中有关于数独的生成方法,普通的方法也是采用回溯,还有一种方法是用置换矩阵的方法。


放出图片是想说明,采用置换的方法,思想真的超级简单,随便在博客上记录下这种思想....但考虑到作业中与学号要关联,想到用回溯比较简单,就采用回溯了...

设计实现

程序比较简单,就只有两个函数,一个check函数是否符合数独的约束条件,一个checkInput函数检查运行参数的合法性。至于生成数独直接在主函数中采用两个while循环输出了,如果用递归的话,可能会消耗非常多的内存。

代码说明

核心代码就是两个while循环,主要是回溯法的思想

当发现不能符合约束条件时,设置

sudoku[i][j] = 0;  
--k;  //这个步骤非常重要,因为少了它就不可能回溯成功。在要求生成给定数量矩阵的解决办法也是根据这个,如果都可以符合要求,我假设这个不能符合,回退一步,就可以生成多个。

测试运行

对于使用参数运行的设置

性能分析

测试时我采用直接在exe中输出,得到的分析图:

由于生成数独文件直接在main中输出了,这是main函数的分析图

在生成多个数独矩阵时,程序输出占了主要。

PSP表格 (感觉写程序时好像没有注意这边,现在回想可能比实际误差非常大)

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划
· Estimate · 估计这个任务需要多少时间 20小时
Development 开发 - -
· Analysis · 需求分析 (包括学习新技术) 6小时 8小时
· Design Spec · 生成设计文档 2小时 -
· Design Review · 设计复审 (和同事审核设计文档) - -
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 10分钟 -
· Design · 具体设计 2小时 3小时
· Coding · 具体编码 3小时 4小时
· Code Review · 代码复审 20分钟 30分钟
· Test · 测试(自我测试,修改代码,提交修改) 1小时 2小时
Reporting 报告 1小时 2小时
· Test Report · 测试报告 - -
· Size Measurement · 计算工作量 - -
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 10分钟 20分钟
合计 15小时40分钟 20小时

思考与总结

这次的作业,做的比较匆忙。最大的收获是对回溯法的使用。还有对git的使用更加熟练了,而且开始学会使用gitignore了,同时也学到了怎么输入参数测试exe以及vs的使用和性能分析。一开始自己想着如何实现,后来代码写得一直有问题,也找不出来错误。好在看了网上的一些博客顺利解决了。其实实现起来,没有想象的那么复杂。遇到问题不要害怕,应该多学会Google解决。

posted @ 2017-09-10 19:19  tyfu  阅读(481)  评论(5编辑  收藏  举报