这个作业属于哪个课程 | https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1 |
作业要求 | https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1/homework/10494 |
作业目标 | 实现三宫格 |
作业正文 | 如下图 |
其他参考文献 |
一、GitHub 地址
https://github.com/lzx9999
二、PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 240 |
Estimate | 估计这个任务需要多少时间 | 60 | 120 |
Development | 开发 | 800 | 900 |
Analysis | 需求分析 (包括学习新技术) | 60 | 170 |
Design Spec | 生成设计文档 | 40 | 65 |
Design Review | 设计复审 | 30 | 50 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 20 | 40 |
Design | 具体设计 | 50 | 85 |
Coding | 具体编码 | 240 | 650 |
Code Review | 代码复审 | 30 | 40 |
Test | 测试(自我测试,修改代码,提交修改) | 60 | 230 |
Reporting | 报告 | 30 | 150 |
Test Repor | 测试报告 | 30 | 120 |
Size Measurement | 计算工作量 | 20 | 30 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 20 |
合计 | 1560 | 3350 |
三、解题思路
题目要求
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;
}
代码规范化检查
除了有魔法值和未添加作者信息没有错误的地方
运行结果
六、心路历程和收获
经过一系列努力学习与网络资料查询,终于找到点学习的兴趣与动力,以后必须更加努力学习编程,try harder!一分耕耘一分收获,只有付出行动才有收获,哪怕再大的困难只有努力去做,哪怕最后失败了也不存在后悔这一说法,只能下次更加努力学习,找到经验并改正缺点,并越来越好。