博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

2020软件工程作业03

Posted on 2020-03-29 19:21  清华学子  阅读(126)  评论(1编辑  收藏  举报

2020软件工程作业03

作业课程 https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1
作业要求 https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1/homework/10494
作业目标 实现Sudoku
作业正文 见下文
参考文献 百度

1.Github项目地址

https://github.com/james-wade23/20177685

2.PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(小时) 实际耗时(小时)
Planning 计划 4 5
Estimate 估计这个任务需要多少时间 20 48
Development 开发 6 8.5
Analysis 需求分析 (包括学习新技术) 4 5
Design Spec 生成设计文档 2.5 3.5
Design Review 设计复审 3 3
Coding Standard 代码规范 (为目前的开发制定合适的规范) 1.5 2
Design 具体设计 1.5 1.5
Coding 具体编码 6 8
Code Review 代码复审 3 4
Test 测试(自我测试,修改代码,提交修改 2 2.5
Reporting 报告 1 1.5
Test Repor 测试报告 1 1.5
Size Measurement 计算工作量 0.5 1
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 2 3
合计 58 94

3.需求

实现一个命令行程序,不妨称之为Sudoku。

4.解题思路

第一眼看到很懵,无从下手,只能通过百度找寻资料才可以勉强了解一下这个题目。要知道使用回溯,对相关命令进行传参。可以使用排除法进行每行每列的排列。题目要求是做成九宫格形式,对应的就是九阶独数矩阵。不能使用空格。

5.代码分析

package Test;

import java.util.Scanner;

public class Gongge {
public static int[][] group = new int[9][9];
public static int[][] value = new int[9][9];
public static int[][] row = new int[9][9];
public static int[][] ring = new int[9][9];
public static int[][] get_group = new int[9][9];

public void init() {
    String[] S = new String[9];
    for(int i = 0;i < 3;i++) {
        S[i] = "000111222";
        S[3 + i] = "333444555";
        S[6 + i] = "666777888";
    }
    for(int i = 0;i < 9;i++) {
        for(int j = 0;j < S[i].length();j++) {
            group[i][j] = S[i].charAt(j) - '0';
        }
    }
    for(int i = 0;i < 9;i++) {
        for(int j = 0;j < 9;j++) {
            row[i][j] = -1;
            ring[i][j] = -1;
            get_group[i][j] = -1;
        }
    }
}

public void dfs(int step) {
    if(step == 81) {
        for(int i = 0;i < 9;i++) {
            for(int j = 0;j < 9;j++) {
                System.out.print(value[i][j]);
            }
            System.out.println();
        }
        return;
    } else {
        int x = step / 9;
        int y = step % 9;
        if(value[x][y] > 0) {
            dfs(step + 1);
        } else {
            for(int i = 1;i <= 9;i++) {
                if(row[x][i - 1] == -1 && ring[y][i - 1] == -1 &&
                        get_group[group[x][y]][i - 1] == -1 && value[x][y] == 0) {//这里可以判断行列宫中有无重复值
                    value[x][y] = i;
                    row[x][i - 1] = 1;
                    ring[y][i - 1] = 1;
                    get_group[group[x][y]][i - 1] = 1;
                    dfs(step + 1);
                    value[x][y] = 0;
                    row[x][i - 1] = -1;
                    ring[y][i - 1] = -1;
                    get_group[group[x][y]][i - 1] = -1;
                }
            }
        }
    }
}

public static void main(String[] args) {
    Gongge test = new Gongge();
    test.init();
    Scanner in = new Scanner(System.in);
    for(int i = 0;i < 9;i++) {
        String s = in.next();
        for(int j = 0;j < s.length();j++) {
            int t = s.charAt(j) - '0';
            value[i][j] = t;
            if(t != 0) {
                row[i][t - 1] = 1;
                ring[j][t - 1] = 1;
                get_group[group[i][j]][t - 1] = 1;
            }
        }
    }
    test.dfs(0);
}

}

6.测试结果图

静态测试

7.性能测试

用一个微笑来表达现在的心情,哦耶~

8.总结与评价

对不起,我是个菜鸟,真的好多地方不会。多亏同学的指导和百度的帮助。我太菜了,不过好歹对GitHub熟悉了点,性能优化测试都不熟。不过,只要动手就一定会有收获的,加油吧,骚年。期待超越以前的自己,努力学习更多的知识吧。

学号 作业头 github项目地址 代码分析 PSP表格 解题思路描述 设计实现过程 改进程序性能 代码说明 总结 总分
20177685 2 1 1 1 0.5 0.5 0.5 0.5 1 8