[- 作业传送门]
一、Github项目地址
二、在开始实现程序之前,我估计将在程序的各个模块的开发上耗费的时间。
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 40 | |
· Estimate | · 估计这个任务需要多少时间 | 40 | |
Development | 开发 | 970 | |
· Analysis | · 需求分析 (包括学习新技术) | 240 | |
· Design Spec | · 生成设计文档 | 60 | |
· Design Review | · 设计复审 (和同事审核设计文档) | 40 | |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | |
· Design | · 具体设计 | 120 | |
· Coding | · 具体编码 | 240 | |
· Code Review | · 代码复审 | 120 | |
· Test | · 测试(自我测试,修改代码,提交修改) | 120 | |
Reporting | 报告 | 150 | |
· Test Report | · 测试报告 | 60 | |
· Size Measurement | · 计算工作量 | 30 | |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 60 | |
合计 | 1160 |
三、解题思路,心路历程
看到题目的时候感觉很乱,发现和皇后问题有点像,都是有制约条件,于是我就想先把制约的东西写出来。也就是每行不重复,每列不重复,每宫不重复。看了一些关于数独和皇后问题的博客,发现,网上很多是采用随机函数然后一格一格填,填不下去再回溯,但是这种填数的方式可能会遇到会后退非常多步的情况,而且也不能保证不会出现重复的解。因为做题的时间比较少,受到了同学的提示,于是我就尝试了一种按数字填格子的方法。我觉得实现起来和按格子填数没什么差别,就决定是它了!具体的操作就是在棋盘里先把所有合适n的位置填上n,然后再填下一个数。
四、设计实现过程
整个项目有一个类,三个函数。关系情况如下
Init()函数用于初始化,Print()函数用于打印出数独解,Dfs()函数用于求解过程,求解过程不断回溯调用。
其实还可以再细分成输入一个类,输出一个类,这次做的比较粗糙。
五、关键代码
思路上面已经提过了,就是按数字填格子的方法,比如先把全1填好,再填全2……
想好了思路,就是实现的问题了。
if(num == 9) print();
//判断数字是否要更新,只需要判断现在行数是否到8,row表示行数
if (row == 8) Dfs(num + 1, 0);
else Dfs(num, row + 1);
//判断该位置是否可以填写
//其中row表示行数,j表示列数,vis数组代表该位置是否填过,col数组表示该列是否填过,pal表示该宫是否填过
//宫号为npal,计算方式为row / 3 * 3 + j / 3
if (vis[row][j] || col[num][j] || pal[num][npal]) continue;
else vis[row][j] = 1, col[num][j] = 1, pal[num][npal] = 1, map[row][j] = num;
六、测试运行
没有用随机数,第一位固定是 1,随机方式不知道如何排重,待改进。
七、改进思路,性能分析
- 当n=1000时
- n=1000000时
八、实现完程序之后,我在程序的各个模块上实际花费的时间。
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | |
· Estimate | · 估计这个任务需要多少时间 | 60 | |
Development | 开发 | 1160 | |
· Analysis | · 需求分析 (包括学习新技术) | 300 | |
· Design Spec | · 生成设计文档 | 30 | |
· Design Review | · 设计复审 (和同事审核设计文档) | 30 | |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | |
· Design | · 具体设计 | 150 | |
· Coding | · 具体编码 | 320 | |
· Code Review | · 代码复审 | 240 | |
· Test | · 测试(自我测试,修改代码,提交修改) | 60 | |
Reporting | 报告 | 150 | |
· Test Report | · 测试报告 | 60 | |
· Size Measurement | · 计算工作量 | 30 | |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 60 | |
合计 | 1370 |