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

本文介绍了一种数独生成算法的实现过程,包括初始化中间九宫格、通过交叉变换生成周边九宫格的方法,并分析了不同阶段的时间消耗。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)测试运行
885642-20170913173532860-646498444.png

7)性能分析
885642-20170913173608266-618696460.png
885642-20170913173617766-900947398.png
885642-20170913173622797-797129655.png
885642-20170913173654532-338184929.png

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

8)实际花费的时间

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

转载于:https://www.cnblogs.com/zhuangjiaxin/p/7502167.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值