解体思路
一开始拿到题目,没有仔细往后看,把题目当作解数独了。
解数独的话,一开始就想到大一好像写过八皇后,也是有约束条件,然后深度搜索解决。
但是想看看有没有什么优化,结果是看到了这篇博文数独解法小探,里面用了五种方法:回溯法,排列组合法,精确覆盖问题法,模拟退火法以及约束编程法,看着看着就发呆了==。在这个页面上一脸懵逼了好久,后来发现题目看错了,就跑去想怎么解决题目,就没有继续看解数独了,现在还是懵逼中...
要生成数独矩阵的话,其实一开始也是想到,可以用解数独的方法来生成数独,一个个判断过去,不行就回溯。因为前面写过解数独的回溯,所以生成数独的回溯算法就很好理解了。
查找资料的过程中,看到了《编程之美》中有关于数独的生成方法,普通的方法也是采用回溯,还有一种方法是用置换矩阵的方法。
放出图片是想说明,采用置换的方法,思想真的超级简单,随便在博客上记录下这种思想....但考虑到作业中与学号要关联,想到用回溯比较简单,就采用回溯了...
设计实现
程序比较简单,就只有两个函数,一个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解决。