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/WHXRR

二、PSP表格

PSP2.1Personal 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;
    }

代码规范化检查

除了有魔法值和未添加作者信息没有错误的地方

运行结果

六、心路历程和收获

拖了一个星期,意识到再不写就来不及了,然后就做了这次作业。一直都觉得自己代码写的很差,算法和数据结构也是烂的不行,但好歹也看过许多的教程了,会敲最基础的代码,所以大一大二基础没打好造成的后果真的很严重,学过的东西都还给了老师。这次作业问了同学,查了百度,大概了解了要用什么样的思路去解数独,用什么算法,以后要学的东西还有很多。

 

 

posted @ 2020-03-29 14:06  Harriswhx  阅读(157)  评论(0编辑  收藏  举报