2020软件工程作业03
一、GitHub 地址
https://github.com/WHXRR
二、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 180 |
Estimate | 估计这个任务需要多少时间 | 60 | 100 |
Development | 开发 | 800 | 1000 |
Analysis | 需求分析 (包括学习新技术) | 60 | 150 |
Design Spec | 生成设计文档 | 40 | 60 |
Design Review | 设计复审 | 30 | 40 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 20 | 30 |
Design | 具体设计 | 50 | 80 |
Coding | 具体编码 | 240 | 600 |
Code Review | 代码复审 | 30 | 30 |
Test | 测试(自我测试,修改代码,提交修改) | 60 | 200 |
Reporting | 报告 | 30 | 100 |
Test Repor | 测试报告 | 30 | 60 |
Size Measurement | 计算工作量 | 20 | 20 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 120 |
合计 | 1560 | 2770 |
三、解题思路
题目要求
1.实现一个命令行程序,不妨称之为Sudoku。数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次,所以又称“九宫格”。
2.三宫格:盘面是3*3。使1-3每个数字在每一行、每一列中都只出现一次,不考虑宫。
3.用cmd命令行的形式读出写入文件,并传入参数。
四、设计实现过程
1.代码有1个类,4个函数。主函数,backTrace()函数是用回溯法依次填入1-3的值,check()函数是检查填入的值有没有重复,printArray()为打印结果。
2.用一个二维数组来存储这个矩阵,然后定义一个方法来计算。方法里有两个属性——行号和列号。我从网上看到的9宫格的方法是从第0行0列开始,依次往里面填入1-9之间的数字,然后判断填入的这个数字是否能放进去(该行该列和它所在的小九宫格是否有重复数字)。如果能放进去,那么就继续用1-9去试该行的下一列。一直到该行的最后一列,然后换行继续重复上面的步骤,一直执行到最后一个空格,也就是i=8,j=8的时候,且最后这个空格所放的值也完全符合规则,那么此时就算完成,不用再继续调用backTrace方法了,输出正确解即可。
流程图
五、代码说明
判断某行某列赋某个值是否ok
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n=3;
int[][]sudoku=new int[n][n];
System.out.println("输入三宮格:");
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
sudoku[i][j]=scan.nextInt();
}
}
System.out.println("你输入的数组为:");
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
System.out.print(sudoku[i][j]+" ");
if(j==n-1)
System.out.println();
}
}
Sudoku s = new Sudoku(sudoku); s.backTrace(0, 0); } private void backTrace(int i, int j) { if (i == 2 && j == 3) { System.out.println("3宫格"); printArray(); return; } //已经到了列末尾了,还没到行尾,就换行 if (j == 3) { i++; j = 0; } //如果i行j列是0,那么才进入 if (matrix[i][j] == 0) { for (int k = 1; k <= 3; k++) { if (check(i, j, k)) { //将该值赋给该空格,然后进入下一个空格 matrix[i][j] = k; backTrace(i, j + 1); //初始化该空格 matrix[i][j] = 0; } } } else { //如果该位置已经有值了,就进入下一个空格进行计算 backTrace(i, j + 1); } } private boolean check(int row, int line, int number) { //判断该行该列是否有重复数字 for (int i = 0; i < 3; i++) { if (matrix[row][i] == number || matrix[i][line] == number) { return false; } } return true; }
代码规范化检查
除了有魔法值和未添加作者信息没有错误的地方
运行结果
六、心路历程和收获
拖了一个星期,意识到再不写就来不及了,然后就做了这次作业。一直都觉得自己代码写的很差,算法和数据结构也是烂的不行,但好歹也看过许多的教程了,会敲最基础的代码,所以大一大二基础没打好造成的后果真的很严重,学过的东西都还给了老师。这次作业问了同学,查了百度,大概了解了要用什么样的思路去解数独,用什么算法,以后要学的东西还有很多。