2019软工实践第三次作业

1、Github地址:https://github.com/YangSlim/031702243

2、PSP表格

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

3、解题过程

拿到数独这个题目,根据题目要求当数独为4、6、8、9宫格是需要格外判断宫内是否数字有重复。那就先写个函数判断空位所在的那一行和那一列是否有数字重复,对宫的判断另外写个函数,这样行和列判断完在判断一下宫就好。最后用DFS进行遍历,回溯。

对宫进行判断

bool judge_palace(int x, int row, int col, int key)/*4、6、8、9宫格需要对宫进行判断 */
{
    int i, j;

    /* b为x所在的小九宫格左顶点竖坐标 */
    int  b = x / m / row * row;

    /* c为x所在的小九宫格左顶点横坐标 */
    int  c = x % m / col * col;
    for (i = b; i < b + row; i++)
    {
        for (j = c; j < c + col; j++)
        {
            if (a[i][j] == key)
            {
                return false;
            }
        }
    }
    return true;
}

对行和列进行判断完,直接调用对宫判断的函数

bool judge_row_col(int x, int key)/*判断数独的每一列每一行是否重复*/
{
    int row = x / m;
    int col = x % m;
    for (int i = 0; i < m; i++)/*判断行 */
    {
        if (a[row][i] == key)
        {
            return false;
        }
    }
    for (int i = 0; i < m; i++)/*判断列*/
    {
        if (a[i][col] == key)
        {
            return false;
        }
    }
    if (m == 4)/*4宫格*/
    {
        if (judge_palace(x, 2, 2, key))/* 宫的大小2*2 */
        {
            return true;
        }
        return false;

    }
    else if (m == 6)/*6宫格*/
    {
        if (judge_palace(x, 2, 3, key))/* 宫的大小2*3 */
        {
            return true;
        }
        return false;
    }
    else if (m == 8)/*8宫格*/
    {
        if (judge_palace(x, 4, 2, key))/* 宫的大小4*2 */
        {
            return true;
        }
        return false;
    }
    else if (m == 9)/*9宫格*/
    {
        if (judge_palace(x, 3, 3, key))/* 宫的大小3*3 */
        {
            return true;
        }
        return false;
    }
    return true;
}

DFS遍历填入数字

void DFS(int x)/* 深搜构造数独 */
{
    if (sign)/*如果已经完成 直接返回*/
    {
        return;
    }
    if (x == m * m)/* 说明所有的都符合,数独求解完毕,退出递归 */
    {
        print();
        sign = 1;
        return;
    }
    int row = x / m;
    int col = x % m;
    if (a[row][col] != 0)/*当前位置不为空则判断下一空*/
    {
        DFS(x + 1);
    }
    else
    {
        for (int i = 1; i <= m; i++)
        {
            if (judge_row_col(x, i))
            {
                a[row][col] = i;
                DFS(x + 1);
                /* 如果构造不成功,还原当前位 */
                a[row][col] = 0;
            }
        }
    }
}

测试结果

3宫格

4宫格

5宫格

6宫格

7宫格

8宫格

9宫格

性能分析

总结

这次作业花了很多时间在文件的读取和输出上面,因为之前没有在命令行输入参数然后运行代码,走了不少弯路。还有就是熟悉了怎么在本地上传文件到Github。

猜你喜欢

转载自www.cnblogs.com/ycj202595/p/11580989.html
今日推荐