个人项目


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]个人项目的更多相关文章

  1. BUAA 2020 软件工程 个人项目作业

    BUAA 2020 软件工程 个人项目作业 Author: 17373051 郭骏 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人项目作业 ...

  2. BUAA SE 个人项目作业

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人项目作业 我在这个课程的目标是 通过个人项目实践熟悉个人开发流程 一.在文章开头给出教学班级和 ...

  3. 清理Visual Studio 2017的项目历史记录或手工修改Visual Studio 2017的注册表设置

    Visual Studio 2017的"最近的文件列表"和"项目列表"总是删了之后重启电脑又出现(PS:这期间没有打开过项目,更没打开过VS). 一怒之下,按照 ...

  4. Windows 10 更新补丁后Visual Studio 2017 运行项目出现错误

    问题: 今天更新了Windows 10(版本 1709)推送最新补丁后,打开Visual Studio 2017运行Web项目,都出现“指定的参数超出有效值的范围 参数名:site”,如下图: 解决方 ...

  5. VS 2017 VC++项目出现 LNK1104 无法打开文件"libcmtd.lib" 的解决方法

    今天用VS 2017编译一个以前的VC++动态库项目,出现了一个链接器问题: LNK1104 无法打开文件"libcmtd.lib" . 操作系统版本为:Windows 10 18 ...

  6. 【BUAA 软工个人项目作业】玩转平面几何

    BUAA 软件工程个人项目作业 项目 内容 课程:2020春季软件工程课程博客作业(罗杰,任健) 博客园班级链接 作业:BUAA软件工程个人项目作业 作业要求 课程目标 学习大规模软件开发的技巧与方法 ...

  7. BUAA SE | 提问回顾与个人总结

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 提问回顾与个人总结 我在这个课程的目标是 深入理解软件工程 这个作业在哪个具体方面帮助我实现目标 ...

  8. BUAA 软工 结对项目作业

    1.相关信息 Q A 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 结对项目作业 我在这个课程的目标是 系统地学习软件工程开发知识,掌握相关流程和技术,提升 ...

  9. VS 2017 Web项目需要安装Sql Server 2012 Express LocalDB问题

    最近在做mvc5的练习 ,结果到了数据库连接这一阶段就出现了问题,开始我以为<add name="MovieDBContext" connectionString=" ...

  10. 解决 Visual Studio 2017 打开项目提示项目不兼容

    这应该算是VS2017的一个bug,昨天做好的.net core项目还能好好如初,今天打开就提示项目不兼容,未能加载...... 解决办法也是超级简单,但是往往越简单的办法越是想不到: 右键解决方案, ...

随机推荐

  1. jeDate 日期控件

    写在前面的话: 最近在做一个日期范围的功能,研究了一个12306网站的日期范围选择,他用的是jcalendar.js,没有直接在日历插件里面做判断开始时间小于结束时间 而是自己在代码里面做了判断如下: ...

  2. 普通用户使用docker命令

    由于docker 都是root权限启动的容器, 要给研发 登录权限查看log,对于普通用,使用docker是会出现报错, 使用 gpasswd 命令把用户加入到docker组中 gpasswd -a ...

  3. eclipse 报错Version 1.6.0_45 of the JVM is not suitable for this product. Version:1.7 or greater is required

    最近离职来了一家新公司,之前的公司的开发IDE用的是IntelliJIDEA和SpringSourceToolSuit,自己在家里用的也是MyEclipse,所以使用eclipse的经验还是不足.结果 ...

  4. ADO.NET分享

    看到<c#从入门到精通(第三版)>书中对ado.net里几种方法打的比方,很有意思就发一下. 1)这张图中,把数据比作水,储存了大量数据. 2)Connection对象好像进水龙头,插在水 ...

  5. odoo之带出历史订单产品

    这是在sale_origin中下由两张单子{sale_origin_line和history_order} class history_order(osv.osv): _name="hist ...

  6. 微软下一代Web前端技术Blazor(C#编译为WebAssembly)

    W3C Web标准化机构在制定下一代的网页技术WebAssembly.目前版本是1.0,主流浏览器的最新版本都已经支持.其特点是浏览器可以执行编译后的二进制程序,不需要像之前的程序,浏览器下载Java ...

  7. C# 根据部分属性来判断俩个对象是否相同

    根据部分属性来判断俩个对象是否相同 代码是第一版本 可能不牢固 有问题请反馈一下 3QU 效果图: public static class CustomExpand { public static b ...

  8. JSP页面<%@ ...%>是什么意思?

    这表示是指令,主要用来提供整个JSP 网页相关的信息,并且用来设定JSP网页的相关属性,例如:网页的编码方式.语法.信息等.起始符号为: <%@终止符号为: %>目前有三种指令:page. ...

  9. ASP.NET MVC5+EF6+EasyUI 后台管理系统(63)-WebApi与Unity注入

    系列目录 前言: 有时候我们系统需要开放数据给手机App端或其他移动设备,不得不说Asp.net WebApi是目前首选 本节记录Asp.net MVC WebApi怎么利用Unity注入.系列开头已 ...

  10. Houdini toolset environment variable setting

    Game Development Toolset HOUDINI_PATH = "C:\Users\fooldrifter\Documents\houdini17.5\GameDevelop ...