Github项目地址:
作业地址:● 项目相关要求
2)在开始实现程序之前,在下述PSP表格记录下你估计将在程序的各个模块的开发上耗费的时间。
- PSP表格在下方。
3)解题思路描述。即刚开始拿到题目后,如何思考,如何找资料的心路历程。
不重复,
数独中的数字排列千变万化,那么究竟有多少种终盘的数字组合呢?
6,670,903,752,021,072,936,960(约为6.67×10的21次方)种组合,2005年由Bertram Felgenhauer和Frazer Jarvis计算出该数字,并将计算方法发布在他们网站上,如果将等价终盘(如旋转、翻转、行行对换,数字对换等变形)不计算,则有5,472,730,538个组合。数独终盘的组合数量都如此惊人,那么数独题目数量就更加不计其数了,因为每个数独终盘又可以制作出无数道合格的数独题目。由此可见,就算固定一个数,题目要求的N依旧远小于总数,因此在1000000以内重复的可能性很小,若是每生成一个数独,都与之前生成的数独比较,不仅增加了麻烦,还浪费了时间,所以不重复应该不予考虑。
接下来就要生成随机数独
在这里,我采取从左往右从上到下,每一个方格都从1-9中随机选取,选中的删除,进行判断(比较该方格的行、列、宫是否有相同的数),若不符合则重新选取;若选取符合的数则进行下一个方格;若是当达到有一个方格没有符合的数时,则返回上一个方格重新选取;直到最后一个方格置数完毕。 判断:由于是按照从左到右从上到下的顺序,所以只需要比较本行该格之前本列该格之上的数即可。至于九宫则是先取到本九宫的第一个索引值再按照一样的顺序比较。
4)设计实现过程。设计包括代码如何组织,比如会有几个类,几个函数,他们之间关系如何,关键函数是否需要画出流程图?
- 代码设计一个Sudoku类,类私有成员有一个9*9二维矩阵,公有函数有构造函数Sudoku,输出函数display,判断函数judge,填充函数setnum。其中,Sudoku函数用于初始化,使各个方格为0且第一个为要求的数;判断函数为填充函数作出判定填充的数是否符合数独规则。输出函数在填充完毕后用于输出到控制台界面和指定Sudoku.txt中。由于我的算法过于简单,我就没画流程图。
5)代码说明。展示出项目关键代码,并解释思路与注释说明。(5‘)
bool Sudoku::setnum(int row, int col) //填数{ vector num; //创建一个从1-9的数组用于填充 for (int i = 0; i
6)测试运行。程序必须是可运行的,展示出程序运行的截图。PS:如果有扩展需求或者更高级的需求,请秀出来,有额外加分。
7)记录在改进程序性能上所花费的时间,描述你改进的思路,并展示一张性能分析图,并展示你程序中消耗最大的函数。PS:如果采用Visual Studio Community 2015开发,使用C++或者C#语言实现,VS 2015的性能分析工具可自动生成。
这是我的程序在电脑上的程序性能分析图。(10000个,release)
打出10000个就已经花了这么多时间,很显然,我的程序需要优化。图中可以看出是display函数占据时间最多,所以也就是我的io输出较慢。
8)在你实现完程序之后,在下述PSP表格记录下你在程序的各个模块上实际花费的时间。
- PSP表格在下方。
● 遇到的困难及解决方法
- 困难描述 程序敲完后,我试着能生成数独也就不管了,可是到了学校,写博文的性能分析时发现我的算法还不够简便,打出10000个就花了这么多时间,远远达不到同学敲的程序运行速度,所以急需优化。
- 做过哪些尝试 想要优化程序,只能改变算法,比如把每格1-9改为或者按数字1-9先后填,本想把同学的代码借鉴一下,后来想想算了,还是我自己解决。可是由于思路不明,每运行程序总是卡住,没输出。最终我没写出来,只能把目前的程序上交。
- 是否解决 很遗憾,最终并未解决。
- 有何收获 虽然经过长时间尝试还是失败了,但是我锻炼了思维方式,了解新的逻辑方法,增强了解决问题的能力,加强了分析和实践能力。
● PSP
(以下并不包括尝试改变和优化算法的时间)PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
· Estimate | · 估计这个任务需要多少时间 | 7*60 | 8.5*60 |
Development | 开发 | ||
· Analysis | · 需求分析 (包括学习新技术) | 1*60 | 40 |
· Design Spec | · 生成设计文档 | 20 | 20 |
· Design Review | · 设计复审 (和同事审核设计文档) | 5 | 10 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
· Design | · 具体设计 | 10 | 10 |
· Coding | · 具体编码 | 2*60 | 3*60 |
· Code Review | · 代码复审 | 30 | 30 |
· Test | · 测试(自我测试,修改代码,提交修改) | 1*60 | 1.5*60 |
Reporting | 报告 | ||
· Test Report | · 测试报告 | 1*60 | 80 |
· Size Measurement | · 计算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 30 |
合计 |