软件工程 | https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1 |
---|---|
作业要求 | https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1/homework/10494 |
作业目标 | PSP表格、描述解题思路、设计实现过程、改进程序性能、展示关键代码,收获和感悟 |
作业正文 | 如下文 |
参看文献 | CSDN,百度,同学建议 |
Github项目地址:
https://github.com/17jkxyq/RG02
PSP2.1 | Personal Software Process Stage | 预估耗时(小时) | 实际耗时(小时) |
---|---|---|---|
Planning | 计划 | 90 | 60 |
Estimate | 估计这个任务需要多少时间 | 4835 | 5580 |
Development | 开发 | 2500 | 3000 |
Analysis | 需求分析(包括学习新技术) | 360 | 300 |
Design Spec | 生成设计文档 | 90 | 75 |
Design Review | 设计复审(和同事审核设计文档) | 25 | 35 |
Coding Standard | 代码规范(为目前的开发制定合适的规范) | 25 | 15 |
Design | 具体设计 | 180 | 200 |
Coding | 具体编码 | 1200 | 1500 |
Code Review | 代码复审 | 90 | 60 |
Test | 测试(自我测试,修改代码,提交修改) | 150 | 200 |
Reporting | 报告 | 45 | 45 |
Test Report | 测试报告 | 30 | 30 |
Size Measurement | 计算工程量 | 20 | 25 |
Postmortem & Process Improvement Plan | 事后总结提出过程改进计划 | 30 | 35 |
合计 | 4835 | 5580 |
思路描述
一开始看到题目,当时想到的方法就是每一行都随机生成一个1-9的全排列。但是题中最多需要生成的数独终局可能达到1000000,显然从时间角度来看,这种方法不现实。
于是开始上网查询相关方法。在查询的过程中发现,发现一个数独终局可以由第一行的特定平移序列构成,且交换前三行的任意两行,中间三行的任意两行或最后三行的任意两行,
都会生成一个新的终局。基本上解开数独题都是通过深度搜索和回溯法来完成的。也因此,定下了最后代码的基调也是以此来完成。
流程图
关键代码
借鉴test_only(int m,int i,int j,int test)函数,采用了余数的方法来的得出当前在的小宫的位置,并加以运算获得该从何处开始何处停止的信息。
test_only()使用余数这点来指明小宫格的具体位置以及运算出其循环判断时需要的范围
delete_all(int m)函数,用于一个数独盘完成解答输出后清除数据,为下一个数独做准备。
void delete_all(int m) //for next loop
{
int i,j;
for(i=1;i<=m;i++)
for(j=1;j<=m;j++)
a[i][j]=0;
}
性能分析
单元测试
改进
在实现数独第一行的全排列时,采用的是蛮力法,直接使用多个循环实现,大大消耗了时间,因此进行了优化。
参考了网上的方法建议,考虑到无解也应该报告,于是特地加了 if(flag==0) f<<"Error: No answer!"<<endl;
如图 无解也会进行了相应的报告
收获和感悟:
刚开始并不知道从哪里下手,询问了同学也参考了网上的方法,决定从简单的三宫格入手,但是还是不尽如人意。最后还是通过各种渠道的资料查询
多方借鉴才勉强做完,这里也是看出来自己的只适合技术储备存在较大缺口,需要着实进行提升和改进,在编程语言的选择上,之前一直都是偏向java,
但这次选择了C,也是想尝试不同的语言,来进行多方面的提升,个人还是会偏向java一些。但是无论是什么样的编程语言,编程能力始终是最大的考验。
通过这几次的作业,我发现自己在编程和软件使用上面越来越薄弱了,也是希望借着这样的作业更好地提升自己的能力吧。
评价