您的位置:首页 > 其它

软件工程 第二次作业(改)

2017-09-10 22:54 218 查看
GitHub:Sudoku

题目地址

这次的作业大意就是写个数独库生成器(对于输入的n1~1000000,生成相对应数量的不同数独)


psp表格


PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划3020
· Estimate· 估计这个任务需要多少时间
Development开发
· Analysis· 需求分析 (包括学习新技术)160320
· Design Spec· 生成设计文档
· Design Review· 设计复审 (和同事审核设计文档)
· Coding Standard· 代码规范 (为目前的开发制定合适的规范)
· Design· 具体设计2030
· Coding· 具体编码300220
· Code Review· 代码复审
· Test· 测试(自我测试,修改代码,提交修改)100300
Reporting报告
· Test Report· 测试报告
· Size Measurement· 计算工作量
· Postmortem & Process Improvement Plan· 事后总结, 并提出过程改进计划4045
合计650965

看了题目后的分析过程(解题思路):


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函数上面消耗的时间最长


改进的思路:

还没想到实质性的改进思路,等成绩出了,拜读几篇大佬的博客后再做改进。



反思:


问题想的太简单,具体做的时候错误百出,导致没能按时提交,当做一个警告了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: