软件工程个人项目——数独-1.5
Github项目地址
https://github.com/JackManTvO/sudoku
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 12 |
Estimate | 估计这个任务需要多少时间 | 20 | 12 |
Development | 开发 | 520 | |
Analysis | 需求分析(包括学习新技术) | 120 | 170 |
Design Spec | 生成设计文档 | 30 | 55 |
Design Review | 设计复审(和同时审核设计文档) | 20 | 15 |
Coding Standard | 代码规范(为目前的开发制定合适的规范) | 20 | 10 |
Design | 具体设计 | 60 | 80 |
Coding | 具体编码 | 180 | 280 |
Code Review | 代码复审 | 30 | 40 |
Test | 测试(自我测试,修改代码,提交修改) | 60 | 120 |
Reporting | 报告 | 100 | |
Test Report | 测试报告 | 60 | |
Size Measurement | 计算工作量 | 10 | |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 30 | |
合计 | 640 |
??具体步骤如下:
- 生成一固定的有效终局作为模板。
- 对模板进行数字交换。
- 对进行数字交换后的终局进行行交换(2~3行交换、4~6行交换、7~9行交换)保证宫内不重复。
- 若生成终局数满足程序要求个数即返回,若不满足,重复进行步骤2、步骤3。
??具体步骤如下:
- 扫描题目,将空白值坐标取出存入数组A。
- 在数组A中选择下一个坐标。
- 查询其所在行、列、宫的数值,填入可行解数组,在可行解数组中选取下一可行解填入。
- 若填入成功,则返回步骤2,若无可行解,则在数组A中返回上一坐标,返回步骤3填入另一可行解。若A中无剩余,则返回,求解数独成功。
Seed类(改进前)
变量名称 | 类型 | 说明 |
---|---|---|
val | int[9] | 生成向量值 |
接口名称 | 参数类型 | 返回类型 | 功能 |
---|---|---|---|
Seed | null | null | 根据宏定义的首数字生成生成向量 |
swapi | int(脚标1),int(脚标2) | null | 根据脚标交换向量中两数的位置 |
getVal | int(脚标) | int(结果) | 根据脚标查询向量中数值 |
变量名称 | 类型 | 说明 |
---|---|---|
x | int | 横坐标 |
y | int | 纵坐标 |
pos | int[10] | 点的可行解标识 |
接口名称 | 参数类型 | 返回类型 | 功能 |
---|---|---|---|
Point | null | null | 初始化类 |
Point | Point*(实例) | null | 初始化类使其值与实例相同 |
变量名称 | 类型 | 功能 |
---|---|---|
seed | Seed | 生成向量 |
val | int[9][9] | 数独 |
zero | Point[60] | 空缺点集合 |
接口名称 | 参数类型 | 返回类型 | 功能 |
---|---|---|---|
permuate | int(层数) | null | 根据层数dfs全排列 |
mod | null | null | 根据生成向量生成模板 |
generate | null | null | 全排列交换行生成终局 |
cpy | const Sudoku*(模板) | null | 根据模板复制数独 |
swapRow | int(行数1),int(行数2) | null | 交换两行数值 |
write | FILE*(文件) | null | 将数独写入文件 |
set | char*(字符串),int(行数) | null | 将文件读出,按行给数独赋值 |
dfs | null | int(记号) | 深度优先搜索,成功返回1,失败返回0 |
文章图片
Class Diagram.png 关键函数 元素交换函数
文章图片
permutate.png 行交换函数
文章图片
generate.png 解数独函数
文章图片
dfs.png 单元测试设计 ??使用了代码走读,并对三个关键函数使用路径测试法进行了单元测试:
元素交换函数
路径 | 输入数据 | 输出数据 |
---|---|---|
path1 | level=7 | 多个模板和终局 |
path2 | level=10 | 无预期输出 |
path3 | level=6,nsudoku=0 | 无预期输出 |
path4 | level=6,nsudoku=1 | 1个终局 |
路径 | 输入数据 | 输出数据 |
---|---|---|
path1 | nsudoku=72 | 72个模板和终局 |
路径 | 输入数据 | 输出数据 |
---|---|---|
path1 | 空点集 | 无预期输出 |
path2 | 包含3个点的点集 | 3个点值确定 |
推荐阅读
- 一个人的旅行,三亚
- 一个人的碎碎念
- 七年之痒之后
- 异地恋中,逐渐适应一个人到底意味着什么()
- 遗憾是生活的常态,但孝顺这件事,我希望每一个人都不留遗憾
- NO.38|NO.38 我不是嫁不出去,而是不想嫁
- 良心
- 2019-07-04优美学子杨慧(创业路上,我不是一个人在战斗)
- 一个人活得像一支队伍
- 一个人值班