本文最后更新于:星期二, 三月 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. 设计实现过程

  1. 读取文本文件内容并将其转化成二位数组.

  2. 查找其中为 0 的元素 X.

  3. 扫描元素 X 的同行同列的元素将其加到 Set 集合里面.

  4. 如果 set 集合的大小 小于 宫格级数, 那么这个元 X 素有唯一确定的值.

    否则, 元素 X 的值暂时还不能确定, 要等到其他元素确定时才可以. 所以继续扫描下一个符合条件的元素.

  5. 经过上述步骤, 我们发现有漏网之鱼(前面不能确定的元素), 所以我们在第一步时, 先计算出总共有多少个 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 位大佬学习学习
  • 学会看官方文档(= 学英语)

参考文献

https://www.cnblogs.com/RCJames/p/12529492.html

https://github.com/changorz/work/tree/master/20177583/src


2020软件工程作业      2020软件工程作业

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!

江南之雨

 目录