zoukankan      html  css  js  c++  java
  • 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;
        }

    代码规范化检查

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

    运行结果

    六、心路历程和收获

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

     

  • 相关阅读:
    WPF 碰撞检测
    设置完在Canvas的位置后,控件HitTest不响应的问题
    Comparing the Performance of .NET Serializers(zz)
    Converting Stream to String and back…what are we missing?
    C# 序列化(Serialize)与反序列化(Deserialize)ZZ
    如何:从代码创建 UML 类图(ZZ)
    nginx 502 bad gateway
    mysql innodb_buffer_pool_size mysql占用内存大小和主从复制并行线程数量
    lvreduce -L 1000M /dev/vg0/lv0 表示最后缩减至多大,不是减少了多大
    nginx 4层tcp代理获取真实ip
  • 原文地址:https://www.cnblogs.com/Harriswhx/p/12569011.html
Copyright © 2011-2022 走看看