【数独个人项目】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万的部分其实就是没用处的..)
【数独个人项目】2. 拿到题目之后相关推荐
- 数独小项目开篇:DFS解决数独难题
数独小项目开篇:DFS解决数独难题 前言 DFS解决数独问题思路 代码实现细节 样例测试 总结 Reference 前言 这周小刀是挺忙的,周末加班,哎,谁不是996呢?(打工魂燃烧吧~ 这次 ...
- 2022广东省安全员B证第四批(项目负责人)上岗证题目及在线模拟考试
题库来源:安全生产模拟考试一点通公众号小程序 2022年广东省安全员B证第四批(项目负责人)上岗证题库系广东省安全员B证第四批(项目负责人)国家题库新版教材大纲题库!2022广东省安全员B证第四批(项 ...
- 2022年广东省安全员B证第三批(项目负责人)上岗证题目及模拟考试
题库来源:安全生产模拟考试一点通公众号小程序 2022保育员(中级)考试100题系保育员(中级)复审题库新版习题库!2022保育员(中级)复训题库及在线模拟考试根据保育员(中级)最新教材汇编.保育员( ...
- 深度学习实战项目:速算题目批改
深度学习实战项目:速算题目批改 前言 一.摘要 二.项目框架 三.项目步骤 1. 数据处理 1.1 数据收集 1.2 数据打标 1.3 数据预处理 2. 模型训练 2.1 目标检测 2.1.1 模型介 ...
- 项目中的有趣题目 -- 吃饺子问题
题目描述: 近日,项目中偶遇一个有趣的题目,感慨多多,备忘之.抽象出来,大致是: 桌上一共有100个饺子,其中有10个饺子包了硬币,问:连续吃到硬币的期望次数是多少次? 首先,定义一下这里的连续,如果 ...
- 软件工程师如何测试项目,【软件测试工程师(华为项目)软件工程师面试题目|面试经验】-看准网...
2011.3.30:一面 早上鸡还没叫我就醒来了,在家里简单地打扮打扮,重塑个人形象,胡子长的剃,头发乱的修,然后边穿衣服边拉裤链左手拎包右手锁门地就从家里出来了. 其实,上周三的时候我就收到了面试通 ...
- 天津项目学生实践抓阄题目
有趣的企业shell实战编程题:好消息,老男孩培训学生外出企业项目实践机会(第6次)来了(本月中旬),但是,名额有限,队员限3人(班长带队). 因此需要挑选学生,因此需要一个抓阄的程序: 要求: 1. ...
- 数独——个人项目(项目地址)
一.项目GitHub地址:https://github.com/lc1997622/SudokuProject 二.PSP表格记录: PSP Personal Software Process Sta ...
- 数独(一道经典的dfs题目)
数独 数独是一种传统益智游戏,你需要把一个 9×9 的数独补充完整,使得图中每行.每列.每个 3×3 的九宫格内数字 1∼9 均恰好出现一次. 请编写一个程序填写数独. 输入格式 输入包含多组测试用例 ...
最新文章
- Linux内核调试 - 一般人儿我都不告诉他(一)【转】
- jquery ajax返回Internal server error 500错误解决方案
- SDL 实现多线程 的一些BUG
- spring各种邮件发送
- 中达变频器参数_台达变频器:满足未来驱动需求
- unity的自带特性
- 新手教程:用像素游戏制作大师MV开发游戏(一)
- javascript异步_JavaScript异步并在循环中等待
- Cake Frosting:更具可维护性的C#DevOps
- linux下限制ip访问
- 南阳OJ 16 矩形嵌套
- 浏览器htmlcss面试题
- 中兴网络机顶盒-ZXV10 B860AV1.1-t装第三方软件实现直播
- python解析word文档首、尾页
- goldendict 屏幕取词
- 《SysML精粹》学习记录--第九章
- 数据外泄保护与国土安全部
- 2021年5月23日《一开口就让人喜欢你》读后感
- 阿翔编程学-计算机网络安全知识摘要
- GlusterFS基本部署
热门文章
- 怎么用python画一个皮卡丘,用python画皮卡丘的代码
- 主力吸筹猛攻指标源码_主力吸筹猛攻指标源码_股市吸筹
- 为什么刹车热了会失灵_急!我的刹车为什么突然不管用了?
- bitcoin(1)
- 计算机二级柏林是第几套,2019年计算机二级Office考试内容及时间安排(内附两套原题库)...
- 自动复制吱口令html,【月入六万】吱口令,网页自动复制,进支付宝提示领红包源码...
- springboot集成graphql(一)
- 计算机学院论文谢辞怎么写,论文致谢:函授毕业论文谢辞怎么写
- 实数取整(指针专题)
- Connection接口