第二次作业——个人项目实战

1)Github项目地址
2)耗费的时间
3)解题思路

刚看到这个题目的时候,感觉一脸懵逼,我以为要设计一个数独游戏,后来认真看了一下,是生成求解完的数独,这就比较简了,
附加题好像是做数独游戏的,百度看了一下数独的游戏规则,稍微有了一些想法。一共是9x9=81个空格,可以划分成9个3x3,
然后生成一个1~9的随机序列,依次把这几个序列填入九个大空格,同时判断同一行和同一列不能有相应的数字,后来发现
这个想法很容易进入死胡同。

4)设计实现

百度了一下,发现别人写的一个置换算法,先生成中间的3x3,然后生成上下左右四个3x3,
最后生成四个角的3x3。直接把代码拷贝了过来,再进行一些修改,就可以了。

5)代码说明

// 初始化中间的九宫格
void centerInit()
{
	src.clear();
    for (int i = 0; i < N; ++i)
        src.push_back(i + 1);
    random_shuffle(src.begin(), src.end()); // 随机化序列
 
    int k = 0;
    for (int i = 3; i < 6; ++i)
        for (int j = 3; j < 6; ++j)
            table[i][j] = src[k++];
}
// 由中间的九宫格交叉变换,初始化上下左右四个九宫格
void crossInit()
{
    for (int i = 3; i < 6; ++i)
    {
        int l = 0;
        for (int j = 3; j < 6; ++j)
        {
            if (i == 3)
            {
                table[i + 1][l] = table[i][j];
                table[i + 2][l + 6] = table[i][j];
                ++l;
            }
            else if (i == 4)
            {
                table[i + 1][l] = table[i][j];
                table[i - 1][l + 6] = table[i][j];
                ++l;
            }
            else if (i == 5)
            {
                table[i - 2][l] = table[i][j];
                table[i - 1][l + 6] = table[i][j];
                ++l;
            }
        }
    }
    for (int j = 3; j < 6; ++j)
    {
        int l = 0;
        for (int i = 3; i < 6; ++i)
        {
            if (j == 3)
            {
                table[l][j + 1] = table[i][j];
                table[l + 6][j + 2] = table[i][j];
                ++l;
            }
            else if (j == 4)
            {
                table[l][j + 1] = table[i][j];
                table[l + 6][j - 1] = table[i][j];
                ++l;
            }
            else if (j == 5)
            {
                table[l][j - 2] = table[i][j];
                table[l + 6][j - 1] = table[i][j];
                ++l;
            }
        }
    }
}
 
// 初始化四个角上的四个九宫格
void cornerInit()
{
    for (int i = 0; i < 3; ++i)
    {
        int l = 0;
        for (int j = 3; j < 6; ++j)
        {
            if (i == 0)
            {
                table[i + 1][l] = table[i][j];
                table[i + 2][l + 6] = table[i][j];
                ++l;
            }
            else if (i == 1)
            {
                table[i + 1][l] = table[i][j];
                table[i - 1][l + 6] = table[i][j];
                ++l;
            }
            else if (i == 2)
            {
                table[i - 2][l] = table[i][j];
                table[i - 1][l + 6] = table[i][j];
                ++l;
            }
        }
    }
    for (int i = 6; i < 9; ++i)
    {
        int l = 0;
        for (int j = 3; j < 6; ++j)
        {
            if (i == 6)
            {
                table[i + 1][l] = table[i][j];
                table[i + 2][l + 6] = table[i][j];
                ++l;
            }
            else if (i == 7)
            {
                table[i + 1][l] = table[i][j];
                table[i - 1][l + 6] = table[i][j];
                ++l;
            }
            else if (i == 8)
            {
                table[i - 2][l] = table[i][j];
                table[i - 1][l + 6] = table[i][j];
                ++l;
            }
        }
    }
}

6)测试运行

7)性能分析



数据量比较少时,耗时最多的是初始化函数,生成随机序列,数据量很大时,就变成了输出函数。

8)实际花费的时间

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 30 30
· Estimate · 估计这个任务需要多少时间 300 360
Development 开发 240 300
· Analysis · 需求分析 (包括学习新技术) 120 120
· Design Spec · 生成设计文档 10 10
· Design Review · 设计复审 (和同事审核设计文档) 20 20
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 10 10
· Design · 具体设计 10 10
· Coding · 具体编码 180 240
· Code Review · 代码复审 30 30
· Test · 测试(自我测试,修改代码,提交修改) 60 60
Reporting 报告 60 60
· Test Report · 测试报告 10 10
· Size Measurement · 计算工作量 10 10
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 20 20
合计
原文地址:https://www.cnblogs.com/zhuangjiaxin/p/7502167.html