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://blog.csdn.net/yaocong1993/article/details/78935108

https://blog.csdn.net/hll174/article/details/51090461

 

一、GitHub 地址

https://github.com/lzx9999

二、PSP表格

PSP2.1Personal 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!一分耕耘一分收获,只有付出行动才有收获,哪怕再大的困难只有努力去做,哪怕最后失败了也不存在后悔这一说法,只能下次更加努力学习,找到经验并改正缺点,并越来越好。

 

 

posted @ 2020-06-29 15:53  lzx20177657  阅读(62)  评论(0编辑  收藏  举报