• 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的输入输出搞了半天头都要秃了还是没搞出来。。。

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

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

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

  • 相关阅读:
    SQL中内连接和外连接
    MySQL执行计划解读
    排序算法
    Edge浏览器安装sci-hub插件及使用教程
    MATLAB R2020B 使用教学——窗口布局设置
    PHP半年了,已经可以独立支撑项目,几点心得记录
    看1000行代码不如自己写10行代码
    PHP逻辑运算符中的and和&&以及or和||是有区别的
    自学PHP的野方法
    PHP中SQL查询语句的id=%d解释
  • 原文地址:https://www.cnblogs.com/kazige/p/12592160.html
Copyright © 2020-2023  润新知