第二次作业——个人项目实战

1,GUTHUB地址:https://github.com/sunminming/sudoku

2,

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

3,解题思路

  对于数独最大的印象应该是小时候买的文学杂志上有简单的数独题目,所有刚开始没什么想法。后来查看资料后对于解题思路的第一个想法是从第一行第一列开始依次递归随机生成数,就这样做理论上能做出所有的棋盘,但是可能出现重复。为了避免重复,有想过以行为单位生成,如果遇到不可行就舍弃。这种方法有很多分支,其中有很大一部分是不可行的(同行,同列或同3*3格重复)。所以我打算采用第一行全排列,从第二行到第9行用随机递归的方法。这样做是能保证不重复,但是缺点是生成的数量较少,不过也有9!,即36万多个。

4,设计实现过程

  本次设计代码包括三个函数:Core,IsRight,Print。Core函数是核心函数用来生成每个位置的随机数,每次从1~9中取出一个数放到当前位置,并通过IsRight函数来判断是否可行;IsRight函数用来判断随机数在相应位置是否可行,即判断当前行,列以及3*3格是否有重复。同行同列的判断相对简单。同3*3格判断需要找到该位所属的3*3格,然后按先行后列的顺序与格内所有数比较,直到重复或者比较到该位;Print用来输出数独。流程图大致如下:

5,代码说明

主函数中next_permutation函数来给出不会重复的全排列。

Core函数在1,2,3,4,5,6,7,8,9中随机选一个数并用过IsRight判断,若9个数都不行就舍弃这个数独。

6,运行测试

正确输入

错误输入

7,性能测试

从图上可以看出,Core和IsRight占了大部分是时间,这是可以预见的,毕竟Core是核心函数。但是也能注意到vector的[]操作意外地占用了很大一部分时间,所以我想在给第一行赋值时和Print中可以使用迭代器进行来减少[]操作的时间。

8,实际时间

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

 9,总结

  这是我第一次用C++做自己的小项目,难度比我想象的大很多。因为知识储备不足和时间太赶(刚开始没想到要这么久),算法有很多缺陷。希望能通过一个学期的学习增强自己。以后也会留更多时间给高级软工这门课程。

原文地址:https://www.cnblogs.com/sunminming/p/7638500.html