2020软件工程作业03

这个作业属于哪个课程 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
}

八、运行结果

九、总结

经过一个多星期的努力,虽然没有交出一份完美的作业,但至少基本得到了结果,txt的输入输出搞了半天头都要秃了还是没搞出来。。。

但正如彭琛老师所说的:“完成比完美更重要!”

这次作业我学习到了构建之法中的基本的编程流程原则,在这样的流程下,能够充分的保证代码的实用性和正确性,为以后的学习和工作打下了坚实的基础。

作业的完成也离不开邓畅伟同学和彭琛老师的帮助与支持,三人行必有我师,学习不能只靠单打独斗,编程更是这样,一个好的团队既可以完成优秀的产品,也可以提高工作的效率,做到真正的事半功倍!

原文地址:https://www.cnblogs.com/kazige/p/12592160.html