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/villanelleshang/dejavu/tree/master/20177618

2.PSP表格

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

3.思路

回溯法

首先给出解法的主体,利用回溯的思想。

void backtrace(int n)//回溯法进行填数
{
    int i;
    if (n == m * m)//满了就完成填数
    {
        output();//输出结果
        return;
    }
    int row = n / m;
    int col = n % m;
    if (a[row][col] == 0)
    {
        for (i = 1; i <= m; i++)
        {
            if (check(n,i))//可以填数
            {
                a[row][col] = i;
                backtrace(n + 1);//进入下一层函数
                a[row][col] = 0;//回溯
            }
        }
    }
    else
    {
        backtrace(n + 1);//进入下一层函数
    }
}
 

根据介绍,可以看出填数时需要验证行列以及宫内是否重复,由此
由于357宫格不用验证宫,4689需要验证,check()函数中需要一个判断是否验证宫的部分,若需要验证,则调用check_gong()函数进行验证。

下面给出check函数和检验宫的check_gong函数

bool check(int n,int x)//行和列的验证
{
    int row = n / m;
    int col = n % m;
    int i, j, k=1;
    for (i = 0; i < m; i++)//验证行
    {
        if (a[row][i] == x) return false;
    }
    for(j = 0; j<m; j++)//验证列
    {
        if (a[j][col] == x) return false;
    }
    //判断是否需要验证宫
    if (m == 4) k = check_gong(n, x, 2, 2);
    else if (m == 6) k = check_gong(n, x, 2, 3);
    else if (m == 8) k = check_gong(n, x, 4, 2);
    else if (m == 9) k = check_gong(n, x, 3, 3);
    if(k==1) return true;
    else return false;
}

bool check_gong(int n, int x, int row, int col)//验证宫
{
    int i, j;
    int r = n / m;
    int c = n % m;
    r = r / row * row;
    c = c / col * col;
    for (i = r; i < (r + row); i++)
    {
        for (j = c; j < (c + col); j++)
        {
            if (a[i][j] == x) return false;
        }
    }
    return true;
}

下面给出3宫格到9宫格的输入输出文件截图

 测试图 3456789宫格

  

Code Quality Analysis分析

 Studio Profiling Tools测试

 总结

心累

原文地址:https://www.cnblogs.com/villanelel/p/12592505.html