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