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 |
合计 |