[buaa-SE-2017]个人项目
个人项目
Part1:github
https://github.com/Aria-K-Alethia/Sudoku
Part2:解题思路描述
关于数独的解法
我选择的是暴力搜索算法。
(1)关于 -c
首先,本题要求生成的数独最多为1,000,000个,并且要生成的数独都是9x9规模的,而并不是nxn规模,再加上数独本身的限制可以实现一定程度上的剪枝,因此暴力搜索是可行的。
另一方面,本题需要生成的数独各不相同,暴力搜索可以搜索所有的可行解,很容易实现不重复的要求,所以最终我选择暴力搜索的方法。
(2)关于-s
暴力搜索在解决数独的时候只需要搜索到一个解就可以,虽然对于一些递归层数比较深的数独会有些乏力,不过总体上也可以接受。
关于其他解法
我在分析的题目时候查找了其他的解法,包括dancing link、分治,但是dancing link的复杂度较高(参看算法实践——舞蹈链(Dancing Links)算法求解数独),且其实现复杂,所以不使用。
分治的方法将9x9盘面分成9个3x3的盘面,每次在每个盘面上生成数字,这个和普通的回溯法实际是类似的,所以效率应该也类似(关于效率参看【算法研究】数独高效完全解生成算法的研究和实现),而且最后我用暴力法实现之后也证明了这一点。
Part3:设计实现过程
关于设计
我的设计比较简单,整个程序分为3个类:
- InputHandler:处理和分析输入。
- Sudoku:处理所有数独相关操作。
- Output:处理所有错误输出。
程序的流程就是由InputHandler处理输入,然后Sudoku根据不同的指令来解决,如果这个过程中有什么错误发生则会由Output响应。
关于测试
测试中,首先测试了基本功能,然后针对一些边界值(比如空文件和生成0个数独)进行了测试。
在性能改进之后,又进行了回归测试。
测试初始化:

这里设置了相关参数
下图是其中一个测试单元:

这个测试单元测试了
bool get_board(fstream &file,char board[][LEN+1])
这个方法从file文件中读入一个数独,成功则返回true,如果数独的行数不够则返回false,我们首先读入一个正确的数独,然后在文件中输入错误信息之后重新测试,这时outcome变量应该是false。
Part4:性能分析和改进
我在性能改进上大概花费了3个小时的时间。
最初我使用了c++的内置类string来处理输出,但是性能分析之后发现速度太慢,输出1million个需要1分钟,所以我针对这一点以及I/O输出进行了优化,具体体现在:
- 替换string转而使用char*来处理字符串
- 将所有结果存储在一个大数组中,最后直接输出所有结果,而不是每次输出一个数独终局。
之后程序在I/O上已经不花费太多的时间,根据性能分析图可以看到,大部分的时间都集中在回溯搜索上:

Part5:关键代码
回溯部分代码:
for (int k = 1; k <= LEN; ++k) {
if (Sudoku::count >= n) return; //if generate enough sudoku,return
if (check_generate_pos(i, j, k)) { //check if it is ok to set k on (i,j)
board[i][j] = k + '0';
trace_back_n(i, j + 1, n, file); //if can,recur to next place
}
}
遍历所有可能的数字,首先检查生成的数独是否足够,如果足够就返回,不足够就检查当前数字能否插入位置(i,j),如果能就插入然后继续递归。
Part6:PSP表
| PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
| Planning | 计划 | 30 | 20 |
| · Estimate | · 估计这个任务需要多少时间 | 5 | 5 |
| Development | 开发 | 60 | 60 |
| · Analysis | · 需求分析 (包括学习新技术) | 180 | 480 |
| · Design Spec | · 生成设计文档 | 30 | 20 |
| · Design Review | · 设计复审 (和同事审核设计文档) | 0 | 0 |
| · Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 5 | 0 |
| · Design | · 具体设计 | 60 | 120 |
| · Coding | · 具体编码 | 120 | 180 |
| · Code Review | · 代码复审 | 60 | 180 |
| · Test | · 测试(自我测试,修改代码,提交修改) | 60 | 60 |
| Reporting | 报告 | 30 | 30 |
| · Test Report | · 测试报告 | 30 | 30 |
| · Size Measurement | · 计算工作量 | 5 | 5 |
| · Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 30 |
| Total | 合计 | 705 | 1220 |
Part7:总结
由于我之前没有学过C++,所以这次在技术学习上花费了很多时间,导致最后没有太多的时间来coding,所以个人觉得这次代码的质量并不太好。
不过这次也有很多收获,能初步运用C++、学了VS这个超强大IDE。
[buaa-SE-2017]个人项目的更多相关文章
- BUAA 2020 软件工程 个人项目作业
BUAA 2020 软件工程 个人项目作业 Author: 17373051 郭骏 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人项目作业 ...
- BUAA SE 个人项目作业
项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人项目作业 我在这个课程的目标是 通过个人项目实践熟悉个人开发流程 一.在文章开头给出教学班级和 ...
- 清理Visual Studio 2017的项目历史记录或手工修改Visual Studio 2017的注册表设置
Visual Studio 2017的"最近的文件列表"和"项目列表"总是删了之后重启电脑又出现(PS:这期间没有打开过项目,更没打开过VS). 一怒之下,按照 ...
- Windows 10 更新补丁后Visual Studio 2017 运行项目出现错误
问题: 今天更新了Windows 10(版本 1709)推送最新补丁后,打开Visual Studio 2017运行Web项目,都出现“指定的参数超出有效值的范围 参数名:site”,如下图: 解决方 ...
- VS 2017 VC++项目出现 LNK1104 无法打开文件"libcmtd.lib" 的解决方法
今天用VS 2017编译一个以前的VC++动态库项目,出现了一个链接器问题: LNK1104 无法打开文件"libcmtd.lib" . 操作系统版本为:Windows 10 18 ...
- 【BUAA 软工个人项目作业】玩转平面几何
BUAA 软件工程个人项目作业 项目 内容 课程:2020春季软件工程课程博客作业(罗杰,任健) 博客园班级链接 作业:BUAA软件工程个人项目作业 作业要求 课程目标 学习大规模软件开发的技巧与方法 ...
- BUAA SE | 提问回顾与个人总结
项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 提问回顾与个人总结 我在这个课程的目标是 深入理解软件工程 这个作业在哪个具体方面帮助我实现目标 ...
- BUAA 软工 结对项目作业
1.相关信息 Q A 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 结对项目作业 我在这个课程的目标是 系统地学习软件工程开发知识,掌握相关流程和技术,提升 ...
- VS 2017 Web项目需要安装Sql Server 2012 Express LocalDB问题
最近在做mvc5的练习 ,结果到了数据库连接这一阶段就出现了问题,开始我以为<add name="MovieDBContext" connectionString=" ...
- 解决 Visual Studio 2017 打开项目提示项目不兼容
这应该算是VS2017的一个bug,昨天做好的.net core项目还能好好如初,今天打开就提示项目不兼容,未能加载...... 解决办法也是超级简单,但是往往越简单的办法越是想不到: 右键解决方案, ...
随机推荐
- swift的类型描述符
Metatype Types A concrete or existential metatype in SIL must describe its representation. This can ...
- Spark远程调试参数
Spark远程调试脚本: #调试Master,在master节点的spark-env.sh中添加SPARK_MASTER_OPTS变量 export SPARK_MASTER_OPTS="- ...
- 【转】wampserver2.5 apache2.4.9配置https 图文
注: 我的wamp环境是2.5版本,apache是2.4.9 装在本地C:wamp 操作系统windows10 1.进入wamp->bin->apache->apache2.4. ...
- 【转】MySQL理解索引、添加索引的原则
索引用于快速找出在某个列中有一特定值的行.不使用索引,MySQL必须从第1条记录开始然后读完整个表直到找出相关的行,还需要考虑每次读入数据页的IO开销.而如果采取索引,则可以根据索引指向的页以及记录在 ...
- MYSQL中的int(11)到底代表什么意思?
对于int类型的一些基础知识其实上图已经说的很明白了,在这里想讨论下常用的int(11)代表什么意思,很长时间以来我都以为这代表着限制int的长度为11位,直到有天看到篇文章才明白,11代表的并不是长 ...
- go标准库的学习-io/ioutil
参考https://studygolang.com/pkgdoc 导入方式: import "io/ioutil" 包ioutil实现了一些I/O实用程序函数. 1.var 变量 ...
- MetaMask/safe-event-emitter
https://github.com/MetaMask/safe-event-emitter safe-event-emitter An EventEmitter that isolates the ...
- Web 前端怎样入门?(转)
转自知乎https://www.zhihu.com/question/32314049/answer/100898227
- 一、java三大特性--封装
封装字面意思即包装.专业点来说就是数据隐藏,是指利用抽象数据将数据和基于数据的操作封装起来,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能的隐藏细节,只保留一些对外的接口和外部 ...
- Luogu P1330 封锁阳光大学
这是一道神坑题! 刚开始看了题还以为是Tarjan(我也不知道Tarjan有什么用). 然后发现这是染色问题的模板题! 找到没有染色的点,然后将它涂成1(一共只有1,2两种颜色) 与它相连的点进行广搜 ...