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

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

 改进的思路:

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

 反思:

问题想的太简单,具体做的时候错误百出,导致没能按时提交,当做一个警告了。

posted @ 2017-09-10 22:54  咸疑人  阅读(145)  评论(4编辑  收藏  举报