解题思路:
一开始拿到题目后就想到了八皇后问题,于是就在想想用熟悉的DFS把它先写出来。于是又想到怎么表示九宫格,是要用一个数用然后算式计算位置,还是直接用x,y表示坐标位置,在纸上计算了很久之后还是直接用x,y暴力表示比较简单(嘿嘿)。看到随机的要求后感觉要ran数,但是后面感觉会用时很长就没有用了,直接从一到九开始算。
之后又再网上找了一点数独的解题思路后就开始准备写代码。遇到bug在解决。
设计实现
分为两个函数:DFS和输出函数,检查函数。还有一个主程序。
代码说明
int check(int x, int y, int m) //检查是否重复的函数
{
int x0, y0;
for (int i = 0; i <= 7; i++)
{
if (Data[x][(y + i) % 9 + 1] == m) //检查行
{
return false;
}
if (Data[(x + i) % 9 + 1][y] == m) // 检查列
{
return false;
}
}
if ((double)x / 3 <= 1) x0 = 0;
if ((double)x / 3 >1 && (double)x / 3 <= 2) x0 = 1;
if ((double)x / 3 >2 && (double)x / 3 <= 3) x0 = 2;
if ((double)y / 3 <= 1) y0 = 0;
if ((double)y / 3 >1 && (double)y / 3 <= 2) y0 = 1;
if ((double)y / 3 >2 && (double)y / 3 <= 3) y0 = 2;
for (int i = 1; i <= 3; i++)
{
for (int j = 1; j <= 3; j++)
{
if (Data[(x0 * 3) + i][(y0 * 3) + j] == m) //检查小九宫格
return false;
}
}
return true;
}
void dfs(int x, int y, int n)
{
if (Count >= n)
{
return;
}
if (x>9) //当行超过9行后输出
{
for (int i = 1; i <= 9; i++)
{
for (int j = 1; j <= 9; j++)
{
myfile << Data[i][j] << " ";
//cout << Data[i][j] << " ";
}
myfile << endl;
}
myfile << endl;
Count++;
return;
}
for (int i = 1; i <= 9; i++)
{
if (check(x, y, i))
{
Data[x][y] = i;
if (y >= 9) dfs(x + 1, 1, n);
else dfs(x, y + 1, n);
}
if (y >= 9) Data[x + 1][1] = 0;
else Data[x][y + 1] = 0; //令下个格子的数为零。
}
}
其中的检查函数中的难点对于我来说是要检查搜索小九宫格的数的位置。用了好几种方法在计算总感觉不是很满意。最后只能选择一种比较蠢的方法,将八十一格分成一到九的九个九宫格,然后用x,y计算出在第几个九宫格后遍历。
测试运行
性能分析
当N=1000000时的性能分析图:
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
40 |
35 |
· Estimate |
· 估计这个任务需要多少时间 |
600 |
450 |
Development |
开发 |
600 |
450 |
· Analysis |
· 需求分析 (包括学习新技术) |
100 |
260 |
· Design Spec |
· 生成设计文档 |
20 |
30 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
10 |
25 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
|
|
· Design |
· 具体设计 |
60 |
80 |
· Coding |
· 具体编码 |
100 |
150 |
· Code Review |
· 代码复审 |
60 |
55 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
60 |
110 |
Reporting |
报告 |
60 |
60 |
· Test Report |
· 测试报告 |
30 |
45 |
· Size Measurement |
· 计算工作量 |
30 |
25 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
60 |
30 |
合计 |
|
600 |
790 |