【数独个人项目】2. 拿到题目之后

github地址:https://github.com/Duuang/Project-Sudoku

日期:2018-12-15

2. 拿到题目之后

    这个就是相当于自己做一个项目嘛,体验项目的全套开发过程。

    于是我打算,一定不能上来就啪啪啪写代码,要遵循软件工程规范从头到尾体验一次,肯定会有不少收获,也能为之后真正做项目打下基础。

    于是:先要决定大概的软件开发流程,我选择的迭代的开发模型,流程大概是:

    可行性分析与计划->需求分析->设计->实现->测试->提交,并反复迭代

一、可行性分析与计划:

1. 可行性分析:(肯定可行。。)

2. 计划: 已经在上篇博客中给出,用PSP 2.1表格做出了计划

二、需求分析:

       从pdf文档中获取,项目中的需求还是写的很清楚的,分为:①生成数独  ②求解数独

解题思路:

1. 生成数独:

        可以理解为,就是要生成100万个不重复的数独(左上角数字固定),然后保存在文件里,关键还有个时间限制,60秒内要能生成1000个,并且速度越快越好。

        先不考虑性能需求,生成100万个重复数独。我去查了一下,不同的数独大概一共有6.671*10^21种。。感觉生成100万个不是小意思嘛?用最暴力算法的话,相当于从左上角,一个格子一个格子的从1到9生成,如果不满足条件就回溯,继续查找,就相当于不剪枝的回溯法,直接枚举,这样甚至都能够把所有可能解按照dfs顺序都枚举出来。

       但是。。。估计了一下,可能太慢了,剪枝的话目测也提升不了太多速度。关键是。。只要生成6.671*10^21中的100万个就行,从头挨个枚举有点蠢。。

        后来搜索数独生成算法,看到了一些高级算法,感觉还是有点扯大了。再后来在一篇博客中看到了9!这个数,有362880这么大。。那岂不是只要构造出来仨数独,然后1到9全排列一下,按不同顺序塞进去,不就完事了?(然后直接怒敲了仨9×9的数组上去)后来发现左上角固定。。 8!是40320,也就是说需要25个数独,8个数全排列。所以就转为考虑,能不能生成出来25个不同数独?(不能经过全排列之后相同)

       后来发现能,第一排不妨假设就是1到9,那把第二行的456和789,两个都全排列下,就有了6*6=36种基本数独,问题解决!

        所以就是先生成25个基础数独,再按8!全排列下,就有了100万个

        当然还有两个问题就是读控制台参数并做错误处理,和将数独按格式写入文件,不过这两个都简单,不涉及到算法

2. 求解数独

        看了下,没有性能要求!所以只考虑可接受时间内可解即可。而且不是要枚举出全部解,是只要一个解即可。

        那就简单了,因为数独题里空多的话,枚举的可能性少,好填;数独题里空少的话,约束也少,也很容易就能枚举出一个合格解。所以其实直接回溯枚举+剪枝即可。(甚至剪枝都不必要)如果追求好点的解法,优先选可能性少的、启发式信息有利的空格来进行节点扩展,肯定速度能提升很多。当然还有很多高级算法,不过好多算法都是为了求数独的完全解的,没必要。

        所以最后决定就是回溯+剪枝,有机会的话会尝试更好一些的算法。

三、阶段总结和收获:

      正式开始正规的软工项目流程了!拿到题目后做了计划,先通过读pdf,分析了需求,然后通过查阅资料、自己思考,有了一个大概的解题思路。至此,可行性分析与计划、需求分析阶段结束。

      收获就是,体会到了需求对项目思路的重要性。。要是这个需求是生成哪怕再多两个数量级的数独,那这个方法恐怕都已经不奏效了。。因为这个输入最大只有100万,于是可以方便的用更快速更简单的算法来达到需求。(毕竟达到需求就可以交付了嘛,比如用了个能生成全部数独的算法,但是人家输入就100万,那超出100万的部分其实就是没用处的..)

猜你喜欢

转载自blog.csdn.net/qq_37571192/article/details/85239522