[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项目还能好好如初,今天打开就提示项目不兼容,未能加载...... 解决办法也是超级简单,但是往往越简单的办法越是想不到: 右键解决方案, ...
随机推荐
- 描述整体程序的 app
一个小程序主体部分由三个文件组成,必须放在项目的根目录,如下 app.js文件 App() 函数用来注册一个小程序.接受一个 object 参数,其指定小程序的生命周期函数等.object参数说明如下 ...
- Zabbix安装 Grafana安装
每天学习一点点 编程PDF电子书免费下载: http://www.shitanlife.com/code 前提: 先需要安装好 lamp环境. 官方文档: https://www.zabbix.com ...
- 如何使用openscad绘制一个简单的键帽.
1 新建空项目 2测数据 测量得出数据.这个长方体的长宽高分别是1.6.4.6.8 注意,这三个数据并不是测量得到的数据,而且加了一点公差值(为3D打印做准备) 3画图 写代码 导入模型 为了方便以后 ...
- go标准库的学习-crypto/aes
参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/aes" aes包实现了AES加密算法,参见U.S. Federal ...
- [转]系统架构演变--集中式架构-垂直拆分-分布式服务-SOA(服务治理)-微服务
一.系统架构演变 1.1. 集中式架构 当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本.此时,用于简化增删改查工作量的数据访问框架(ORM)是影响项目开发的关键. 存在的 ...
- MATLAB——线性神经网络
这个函数默认使用最小二乘,所以不需要训练 % example5_1.m x=-:; y=*x-; % 直线方程为 randn(); % 设置种子,便于重复执行 y=y+randn(,length(y ...
- 卸载ros的方法
1)卸载全部ros: sudo apt-get autoremove --purge ros-* 卸载某个ros版本(ros版本可以共存,每次需要切换) 如indigo: sudo apt-get ...
- windows7系统下配置开发环境 python2.7+pyqt4+pycharm
python2.7 链接:https://pan.baidu.com/s/1lPI9AF9GCaakLXsMZLd5mQ 提取码:5xt6 pip 链接:https://pan.baidu.com/s ...
- RabbitMq、ActiveMq、ZeroMq、kafka之间的比较
MQ框架非常之多,比较流行的有RabbitMq.ActiveMq.ZeroMq.kafka.这几种MQ到底应该选择哪个?要根据自己项目的业务场景和需求.下面我列出这些MQ之间的对比数据和资料. 第一部 ...
- Linux下对inode和块的理解
基本概念 首先讲下inode和块的基本概念.在Linux系统中,文件由元数据和数据块组成.数据块就是多个连续性的扇区(sector),扇区是文件存储的最小单位(每个512字节).块(block)的大小 ...