• 2020软件工程作业03


    2020软件工程作业03

    这个作业属于哪个课程 https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1
    作业要求 https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1/homework/10494
    作业目标 1.学会使用与创建PSP表格。
    2.用Java写代码运用算法来实现题目。
    3.性能分析来找出代码中性能瓶颈并改进
    作业正文 https://www.cnblogs.com/hesenbai/p/12594181.html
    其他参考文献 www.baidu.com

    一、Github地址

    https://github.com/hesenbai/20177642

    二、PSP表格

    PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟
    Planning 计划 30 30
    Estimate 估计这个任务需要多少时间 2000 2600
    Development 开发 1200 1200
    Analysis 需求分析 (包括学习新技术) 300 600
    Design Spec 生成设计文档 20 15
    Design Review 设计复审 20 20
    Coding Standard 代码规范 (为目前的开发制定合适的规范) 30 15
    Design 具体设计 180 200
    Coding 具体编码 150 150
    Code Review 代码复审 30 25
    Test 测试(自我测试,修改代码,提交修改) 30 30
    Reporting 报告 30 30
    Test Repor 测试报告 30 30
    Size Measurement 计算工作量 30 30
    Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 15 15
    合计 4095 4990

    三、思路分析

    1、开始看到这道题,题目要求填数,于是我立马联想到上学期算法所学的排序,然后仔细看题目,才发现这是数独填数,第一条思路自然是蛮力法,一个一个填数,匹配,但是时间与空间复杂度高,效率低下,后来经过查找资料和思考,确定了回溯法进行编写。

    四、实现过程

    有两个Java文件——solution.java和sudoku.java

    ​ 1.Sudoku类主要实现的是对命令行参数传入的判断,包含函数 main主函数在此类中包含对dos命令的输入参数的处理来实现其功能。

    2.solution类中实现对数独的填数,和文件的读取和写入操作。包含loadCommands(args)函数、checkcommands()函数、checkcommands()函数、readFile()函数、writeFile(false)函数、getAndDo(i)函数、writeFile(true)函数。

    流程图解:

    五、性能分析




    六、异常处理




    七、关键代码及解析

    回溯方法:
    public void backtrack(int row, int col) {
    
    
            if(gongge[row][col] == 0) {
                for(int d = 1; d <= m; d++) {
                    int idx = 0;
                    if(boxRow > 0) {
                        idx = (row / boxRow ) * boxRow + col / boxCol;
                    }
    
                    if(isPlace(d, row, col)) {
                        //填充数字,并设置填充限制
                        boxArray[idx][d]++;
                        rowArray[row][d]++;
                        coluArray[col][d]++;
                        gongge[row][col] = d;
                        //是否填充到最后一格
                        if ((col == m-1) && (row == m-1)) {
                            sudokuSolved = true;
                        }
                        else {
                            //当到达最后一列的格子,下一个格子跳转到下一行
                            if (col == m-1) {
                                backtrack(row + 1, 0);
                            }else {
                                backtrack(row, col + 1);
                            }
                        }
                        if(!sudokuSolved) {//移除填充后无法进行后续填充的数
    
                            boxArray[idx][d]--;
                            rowArray[row][d]--;
                            coluArray[col][d]--;
                            gongge[row][col] = 0;
                        }
                    }
                }
            }else {
                if ((col == m-1) && (row == m-1)) {
                    sudokuSolved = true;
                }
                else {
                    //当到达最后一列的格子,下一个格子跳转到下一行
                    if (col == m-1) {
                        backtrack(row + 1, 0);
                    }else {
                        backtrack(row, col + 1);
                    }
                }
            }
        }
    

    八、心路历程及收获

    在上周拿到这道题目后,思考了很久,然后开始做这个的时候,也碰到了许多的困难,也总是每晚熬到一两点左右,因为基础不牢固,总有些小地方死活不成功,但是,百度,问大佬们,这些使我渐渐摸索出来了。也更加明白 了自己还有很长很长的路要走呀。

  • 相关阅读:
    实战:当jquery遇上了json
    验证文本域字符个数的正则表达式
    分布式缓存方案:Memcached初探
    Asp.Net Forms验证(自定义、角色提供程序、单点登录) [转]
    C#3.0扩展方法[转]
    HttpWebRequest调用web服务的代码
    解决User.Identity.IsAuthenticated==false 或User.Identity.Name==string.empty的问题[转]
    微软Asp.net Ajax 1.0的AutoComplete控件的几处修正和增强 [转]
    LINQ体验(5)——LINQ语句之Select/Distinct和Count/Sum/Min/Max/Avg(转)
    c# Linq 的分页[转]
  • 原文地址:https://www.cnblogs.com/hesenbai/p/12594181.html
Copyright © 2020-2023  润新知