2020软件工程作业03

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
作业正文 本文
参考文献 百度,CSDN

GitHub地址:https://github.com/yaoDMS/123456/tree/master/sudoku

PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 30 30
Estimate 估计这个任务需要多少时间 1200 1800
Development 开发 240 300
Analysis 需求分析(包括学习新技术) 60 130
Design Spec 生成设计文档 30 30
Design Review 设计复审 20 15
Coding Standard 代码规范(为目前开发制定合适的规范) 20 30
Design 具体设计 20 30
Coding 具体代码 60 420
Code Review 代码复审 20 100
Test 测试(自我测试,修改代码,提交修改) 60 180
Reporting 报告 30 20
Test Repor 测试报告 30 20
Size Measurement 计算工作量 10 15
Postmortem & Process Improvement Plan 事后总结 30 20
合计 1860 3140

解题思路

利用九宫格行列不能重复的性质,在二维数组中实现。

实现过程

流程图

image-20200329192802020

由于3,5,7这三阶数独没有宫,因此可以看成同一类;而4,6,8,9这四阶数独有不同的宫,因此分开来写。把需要求的空余部分用0来代替。

public static void DFS(char[][] arr, int x, int y) {
    if(x == m){
        print(arr);
        System.exit(0);
    }
    if(arr[x][y] == '0'){
        for(int i = 1; i < m+1; i++){
            if(check(arr, x, y, i)){
                arr[x][y] = (char)('0' + i);
                DFS(arr, x + (y + 1) / m, (y + 1) % m);
            }
        }
        arr[x][y] = '0';
    }else{
        DFS(arr, x + (y + 1) / m, (y + 1) % m);
    }
}
public static boolean check(char[][] arr, int x, int y, int k){
    if(m==3||m==5||m==7) {
        for(int i = 0; i < m; i++){
            if
            (arr[x][i] == (char)('0' + k) || arr[i][y] == (char)('0' + k))
            {
                return false;
            }

        }
    }
case 4:
    for(int i = 0; i < m; i++){
        if (arr[x][i] == (char)('0' + k) || arr[i][y] == (char)('0' + k)) {
            return false;
        }

    }
    for(int i = (x / 2) * 2; i < (x / 2 + 1) * 2; i++){
        for(int j = (y / 2) * 2; j < (y / 2 + 1) * 2; j++){
            if(arr[i][j] == (char)('0' + k)){
                return false;
            }
        }
    }
    break;
case 6:
    for(int i = 0; i < m; i++){
        if (arr[x][i] == (char)('0' + k) || arr[i][y] == (char)('0' + k)) {
            return false;
        }

    }
    for(int i = (x / 2) * 2; i < (x / 2 + 1) * 2; i++){
        for(int j = (y / 3) * 3; j < (y / 3 + 1) * 3; j++){
            if(arr[i][j] == (char)('0' + k)){
                return false;
            }
        }
    }
    break;
case 8:
    for(int i = 0; i < m; i++){
        if (arr[x][i] == (char)('0' + k) || arr[i][y] == (char)('0' + k)) {
            return false;
        }
    }
    for(int i = (x / 4) * 4; i < (x / 4 + 1) * 4; i++){
        for(int j = (y / 2) * 2; j < (y / 2 + 1) * 2; j++){
            if(arr[i][j] == (char)('0' + k)){
                return false;
            }
        }
    }
    break;
case 9:
    for(int i = 0; i < m; i++){
        if (arr[x][i] == (char)('0' + k) || arr[i][y] == (char)('0' + k)) {
            return false;
        }
    }
    for(int i = (x / 3) * 3; i < (x / 3 + 1) * 3; i++){
        for(int j = (y / 3) * 3; j < (y / 3 + 1) * 3; j++){
            if(arr[i][j] == (char)('0' + k)){
                return false;
            }
        }
    }
    break;

运行结果

静态检测

没什么大问题

性能分析

总结

看到这个作业,我是真的不想写,总觉得它很麻烦,于是我在题目发布好几天后都没看。直到班级里有人交了之后才仔细看,仔细想。本来基础就不好,更不想做。但环境配置好了之后,发现也不怎么麻烦,还是有收获的。

posted @ 2020-03-29 19:58  Y亦  阅读(218)  评论(0编辑  收藏  举报