本文最后更新于:星期二, 三月 24日 2020, 8:57 晚上
2020 软件工程作业 03
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1 |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1/homework/10494 |
这个作业的目标 | 个人编写程序。 |
作业正文 | https://yc9064.gitee.io/posts/da64d08d/ |
其他参考文献 | www.baidu.com |
1.Github 项目地址
https://github.com/YinChuanLiu/SofterwareProject
2.PSP 表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 30 |
Estimate | 估计这个任务需要多少时间 | 30 | 60 |
Development | 开发 | 10 | 20 |
Analysis | 需求分析 (包括学习新技术) | 20 | 40 |
Design Spec | 生成设计文档 | 20 | 40 |
Design Review | 设计复审 | 20 | 40 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 30 | 60 |
Design | 具体设计 | 60 | 120 |
Coding | 具体编码 | 120 | 240 |
Code Review | 代码复审 | 30 | 60 |
Test | 测试(自我测试,修改代码,提交修改) | 40 | 80 |
Reporting | 报告 | 30 | 60 |
Test Repor | 测试报告 | 30 | 60 |
Size Measurement | 计算工作量 | 10 | 20 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 60 |
合计 | 510 | 1020 |
3. 解题思路
利用九宫格行列元素不重复的特性, 操作二维数组.
4. 设计实现过程
读取文本文件内容并将其转化成二位数组.
查找其中为 0 的元素 X.
扫描元素 X 的同行同列的元素将其加到 Set 集合里面.
如果 set 集合的大小 小于 宫格级数, 那么这个元 X 素有唯一确定的值.
否则, 元素 X 的值暂时还不能确定, 要等到其他元素确定时才可以. 所以继续扫描下一个符合条件的元素.
经过上述步骤, 我们发现有漏网之鱼(前面不能确定的元素), 所以我们在第一步时, 先计算出总共有多少个 0 元素, 在第 4 步 0 元素被确定时, 将其减一, 在最外面加入一层 while 循环, 直到 0 元素的个数为 0 时才跳出循环.
5. 改进程序性能
将各个可能重复使用的变量声明为全局变量, 避免对象的重复生成.
static int arr[][] = new int[9][9];
static int count = 0;
static Set<Integer> set = null;
同时在使用完后及时地关闭各类资源
6. 代码说明
限于本人算法水平(几乎为 0), 该程序仅支持 3 ,5,7 宫格.
命令行运行程序
在项目根目录打开 cmd
输入 javac -encoding utf-9 Sudoku.java
java Sudoku -m 5 -n 2 -i input.txt -o output.txt
判断 i 行 i 列能否确定一个值, 能则修改, 不能则跳过.
/**
* @method 判断 i 行 i 列能否确定一个值, 能则修改, 不能则跳过.
* @param i 元素所在行
* @param j 元素所在列
* @param m 宫格级数
*/
public static void clear0(int i, int j, int m) {set = new HashSet<>();
// 找同一行的
for (int k = 0; k < m; k++) {if (arr[i][k] != 0) {set.add(arr[i][k]);
}
}
// 找同一列的
for (int k = 0; k < m; k++) {if (arr[k][j] != 0) {set.add(arr[k][j]);
}
}
// 至此, 将 a[i][j] 的同一行和同一列的 大于 0 的元素放入了 set 中
// 如果 只有一个元素没放进来, 那么这个 位置 确定了
if (set.size() == m - 1) {for (int k = 0; k < m; k++) {if (!set.contains(k + 1)) {arr[i][j] = k + 1;
}
}
set.clear();
count--;
}
}
单元测试
7. 心历路程与收获
太难了! 我太难了!
一开始拿到题目, 满怀信心, 不就是数独嘛, 别说 9 宫格,10 宫格我也给你做出来.
然鹅, 正准备开始动笔…我是谁? 我在哪? 我要干什么?
在文件读取的时候就碰壁了, 不知道为什么, 字符串转整形的时候老给我报错, 然后又是各种复习,IO 流啊, 字符数组转整型数组,
最后还是默默地看了下邓大佬的代码
文件读取兼整形转换还能这么写? 我 tm 百度都搜不到?
好吧, 其实这些 Java 的官方文档上都有, 只是没人愿意去看鹅已…
Ok, 文件内容读进来了, 该进入正片了. 然鹅…
好吧,9 宫格做不出, 我 3 宫格还不行么? 是我怂了…
不过还好,3,5,7 宫格解题思路基本一致, 完全适用.
经过 2000 year, 代码终于上传到了 github
总结:
- 算法能力还 8 太行, 以后多向寝室里 2 位大佬学习学习
- 学会看官方文档(= 学英语)