软件工程 第二次作业(改)
GitHub:Sudoku
这次的作业大意就是写个数独库生成器(对于输入的n1~1000000,生成相对应数量的不同数独)
psp表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 20 |
· Estimate | · 估计这个任务需要多少时间 | ||
Development | 开发 | ||
· Analysis | · 需求分析 (包括学习新技术) | 160 | 320 |
· Design Spec | · 生成设计文档 | ||
· Design Review | · 设计复审 (和同事审核设计文档) | ||
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | ||
· Design | · 具体设计 | 20 | 30 |
· Coding | · 具体编码 | 300 | 220 |
· Code Review | · 代码复审 | ||
· Test | · 测试(自我测试,修改代码,提交修改) | 100 | 300 |
Reporting | 报告 | ||
· Test Report | · 测试报告 | ||
· Size Measurement | · 计算工作量 | ||
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 40 | 45 |
合计 | 650 | 965 |
看了题目后的分析过程(解题思路):
1.做出正确的数独图(左上角的数字为(1+6)%9+1=8)(如何生成,思路)
思路:回溯(dfs),直观的感觉就像一棵树一样延伸下去
第一个空格直接生成不用判断(题目要求)
然后往下一格一格生成,需要判断是否满足行,列,3*3矩阵
2.输出n个数独图其中不能够重复(如何判断重复)
这个回溯的做法就直接排除了
3.输出文件到指定目录
4.由于要用命令行检测,这里的主函数中要改成支持命令行的形式
5.上传到GitHub
这里有先关教程的链接:传送门
实现过程:
类:一个9*9数独类
其中需要的函数:
主函数,输出函数,dfs函数,判断1~9其中的数字哪些可以被填入(判断函数)
主要的代码:
bool panduan(int x,int y,int num){
for(int i=0;i<9;i++){ //判断行,列
if(sudoku[x][i]==num){
return false;
}
if(sudoku[i][y]==num){
return false;
}
}
for(int i=x/3*3;i<x/3*3+3;i++){ //判断3*3的宫格
for(int j=y/3*3;j<y/3*3+3;j++){
if(sudoku[i][j]==num){
return false;
}
}
}
return true;
}
bool dfs(int x,int y){
if(y==9){
x++,y=0;
}
if(x>8){
print();
n--;
if(n==0){
exit(-1);
}
}
for(int i=1;i<=9;i++){
if(panduan(x,y,i)){
sudoku[x][y]=i;
if(dfs(x,y+1)){
return true;
}else{ //回溯
sudoku[x][y]=0;
}
}
}
return false;
}
测试运行:
性能分析:
选了10000个数据进行测试:
主要在dfs函数上面消耗的时间最长
改进的思路:
还没想到实质性的改进思路,等成绩出了,拜读几篇大佬的博客后再做改进。
反思:
问题想的太简单,具体做的时候错误百出,导致没能按时提交,当做一个警告了。