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);
                }
            }
        }
    }

八、心路历程及收获

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

原文地址:https://www.cnblogs.com/hesenbai/p/12594181.html