地址传送门
PSP
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 10 | 30 |
· Estimate | · 估计这个任务需要多少时间 | 120 | 300 |
Development | 开发 | 200 | 300 |
· Analysis | · 需求分析 (包括学习新技术) | 50 | 200 |
· Design Spec | · 生成设计文档 | 20 | 30 |
· Design Review | · 设计复审 (和同事审核设计文档) | 20 | 30 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 20 |
· Design | · 具体设计 | 20 | 30 |
· Coding | · 具体编码 | 200 | 300 |
· Code Review | · 代码复审 | 100 | 200 |
· Test | · 测试(自我测试,修改代码,提交修改) | 30 | 200 |
Reporting | 报告 | 60 | 100 |
· Test Report | · 测试报告 | 30 | 60 |
· Size Measurement | · 计算工作量 | 20 | 30 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 30 |
合计 | 960 |
心路历程
看到这个题目,我的心有的难受,仿佛要回到数据结构的时代,那是噩梦之一啊,不过看到deadline,毕竟第一生产力,已经没有空彷徨和惆怅了,二话不说开始思考,自己的思路开始也是产生一个随机数,然后一个个填下去,每次填的时候通过一个check函数检查一下正确性。于是上百度了,
作为一个看到100行代码以上头就痛的可怜孩子,这次我忍痛看了10篇以上关于数独生成的算法,主要思路是某种排列组合和回溯,排列组合听起来没什么很有意思,我选择回溯。主要用到以前数据结构学习到的DFS,很重要想要使用这个的原因也在于自己掌握的并不好,想通过这次项目的实践加深对其的理解。主要思想,相信老师有看我的代码,应该可以一眼看出来,但我还是试着在下文去描述下。
设计实现
代码部分主要分为三个函数,check检查部分,即每填入一个数,都进行check,符合条件将其存入b数组,b数组即为可行数的存储数组。还有最核心的DFS函数,即从第一个数开始,如果数符合条件,即开始递归。最后就是输出文件的函数,就是传统套路了。
关键代码
bool DFS(int n)
{
if (n > 80) {
return true;
}//全部遍历完,即结束
int j = 8;
int k = 0;//可行数的个数
int b[9];//存可行的数
num[n / 9][n % 9] = 0;
for (int i = 1; i <= 9; i++)
{
if (Check(n, i) == true) b[k++] = i;
}//将所有可行的数存入b数组
if (k == 0) {
num[n / 9][n % 9] = 0;
return false;
}//没有满足的数,返回错误
else
{
k++;
do
{
k--;
if (k == 0) {
num[n / 9][n % 9] = 0;
return false;
}
int pos = rand() % k;
num[n / 9][n % 9] = b[pos];
swap(b[pos], b[k - 1]);
} while (!DFS(n + 1));//下一个数不存在,即往下递归
return true;
}
}
算法主要的思想是,分为DFS和输出和检验三种,首先将9*9的二维数组全置为0,采用时间随机数放入1-9,维护两个一维数组,a数组是一个是简单粗暴的1-9,另一个b数组是用来存储可行数字的数组,进入某一格的时候,首先检验一遍,用随机数做数组的位置进行随机,然后将可行的位置存到b数组,将这个数组从第一个位置填入九宫格中,一层层递归往下,如果不能进行,返回上一层的时候,将b数组第一个元素与最后一个元素调换位置,并将长度--,这时就能保证再次填入的数字不重复。通过这样递归,最终到第81个位置的时候,即可完成。然后进行文件输出与命令行的调整即可。
测试运行
目前主要存在的问题是输出占用太多时间,如图所示,解决的方法还在探索,目前只是将c++转化为C的输入输出,速度竟然真的提高了一倍,其他关于算法本身的实质性问题就无法解决了,不过每次入睡前都瞑目思考,效果特别好。
关于执行力与泛泛而谈(纯属为了捞分)
个人觉得,这个问题与本身的性格与对这个项目(甚至这个专业)的兴趣有关,与我本身来说,DEADLINE真的是第一生产力,时间对于我来说真的太紧了,前五天开始着手本次代码,并且了解到性能分析、单元测试等许多内容,但是真正实践起来可能还是初步,今后肯定会更加熟悉。泛泛 而谈这个词其实可以对应到我的第一篇博客,很多东西并非刻意为之,只是无法给出确定的东西,当然,这个问题我应该反省,可能对自己不够严格,不,就是不够严格。我相信柯老师说的话了,这门课坚持下去,真的有可能成为一名合格的程序员。
遇到的困难和解决方法
主要还是在代码算法本身,经过百度查资料,和大神舍友的提醒,慢慢找到正确的解决方法。还有一个不可避免的就是,时间的安排。目前主要两块时间,一个是早上8点到12点,和晚上十点后,我发现一个人的时候更容易静下心打代码,开学之后,一定要给自己留下更多的整段时间来解决问题。
关键代码和设计说明
在上文已提到
学习进度条
本周累计100行代码,复习了vs2015,、github、回溯思想。