这个作业属于哪个课程 | https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1/homework/10494 |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1/homework/10494 |
这个作业的目标 | 实现一个命令行程序Sudoku |
作业正文 | 下文 |
其他参考文献 | www.baidu.com |
一、Github地址
https://github.com/atom1998
二、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 60 |
Estimate | 估计这个任务需要多少时间 | 60 | 120 |
Development | 开发 | 800 | 800 |
Analysis | 需求分析 (包括学习新技术) | 60 | 300 |
Design Spec | 生成设计文档 | 40 | 60 |
Design Review | 设计复审 | 30 | 30 |
Coding Standard | 代码规范(为目前的开发制定合适的规范) | 20 | 30 |
Design | 具体设计 | 50 | 100 |
Coding | 具体编码 | 240 | 600 |
Code Review | 代码复审 | 30 | 60 |
Test | 测试(自我测试,修改代码,提交修改) | 60 | 300 |
Reporting | 报告 | 30 | 100 |
Test Repor | 测试报告 | 30 | 60 |
Size Measurement | 计算工作量 | 20 | 20 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 120 |
合计 | 1560 | 2700 |
三、解题思路
DFS深度填数检测+回溯法
1、先把有数字的地方设置标记位为true
2、循环遍历数组中没有标记位true的地方,也就是需要填数的地方
如果当前为0,即a[i][j]==0,判断当前所在的九宫格,然后从数字1-9依次检测是否在行、列、宫中唯一
满足唯一的话,则吧数字赋值给a[i][j]=l+1;然后继续深度遍历为true的话就返回true,否则回溯a[i][j]==0等
不满足满足唯一则判断下一个数字,直到1-9都判断不满足则返回false,会回溯到上一层
如果当前没有0,说明都已经填满且符合唯一条件,则返回true;结束
四、实现过程
1、流程图
2、运用函数
- main(argv)函数
- DFS(i, x, y)函数:判断递归和回溯
五、代码规范化检查
修改前
修改后
六、性能检查和优化
暂时找不到优化空间。。。
七、代码说明
1、关键代码
public static boolean DFS(int[][] a,boolean[][] cols,boolean[][] rows,boolean[][] blocks) {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if(a[i][j]==0){
int k=i/3*3+j/3;
for (int l = 0; l < 9; l++) {
if(!cols[j][l]&&!rows[i][l]&&!blocks[k][l]){//l对于的数字l+1没有在行列块中出现
rows[i][l] = cols[j][l] = blocks[k][l] = true;
a[i][j] = 1 + l;//下标加1
if(DFS(a, cols, rows, blocks)) {
return true;//递进则返回true
}
rows[i][l] = cols[j][l] = blocks[k][l] = false;//递进失败则回溯
a[i][j] = 0;
}
}
return false;//a[i][j]==0时,l发现都不能填进去
}//the end of a[i][j]==0
}
}
return true;//没有a[i][j]==0,则返回true
}