1.GitHub地址:https://github.com/meiminmin/shuduku
2.PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 30 | 30 |
Estimate | 估计这个任务需要多少时间 | 30 | 30 |
Development | 开发 | 900 | 900 |
Analysis | 需求分析(包括学习新技术) | 120 | 120 |
Design Spec | 生成设计文档 | 120 | 120 |
Design Review | 设计复审 | 30 | 30 |
Coding Standard | 代码规范 | 30 | 30 |
Design | 具体设计 | 240 | 240 |
Coding | 具体编码 | 600 | 600 |
Code Review | 代码复审 | 30 | 30 |
Test | 测试 | 30 | 30 |
Reporting | 报告 | 90 | 90 |
Test Report | 测试报告 | 30 | 30 |
Size Measurement | 计算工作量 | 15 | 15 |
Postmortem&Process Improvement Plan |
事后总结并提出过程改进计划 | 45 | 45 |
合计 | 2340 | 2340 |
3. 解题思路描述:该项目的难点在于:文件的读取和输出,命令行,生成不重复终局,解数独四个部分。
(1):文件的读取和输出:在这个项目之前还没接触过文件的读取和输出。所以问了很多大佬以及百度很多资料后终于学会了文件的读取和输出。注意一点:exe要和文件保存在同一个目录下。
(2): 命令行:需要注意的是:int main(int argc, char * argv[]),在cmd输入的时候要判断是c还是s。如果是c要完成的任务是生成c个数独;如果是s要完成的任务是解数独。
(3):生成不重复数独终局:学号尾号24%9+1=7,所以左上角的第一个数是7。于是先写了一个数独终局:
7 8 9 1 2 3 4 5 6
1 2 3 4 5 6 7 8 9
4 5 6 7 8 9 1 2 3
8 9 1 2 3 4 5 6 7
2 3 4 5 6 7 8 9 1
5 6 7 8 9 1 2 3 4
9 1 2 3 4 5 6 7 8
3 4 5 6 7 8 9 1 2
6 7 8 9 1 2 3 4 5
后8行都可以看做根据第一行左移得到,第一行全排列有8!=40320种,然后交换2-3(因为数据只要求1e6,可以不 考虑),4-6,7-9行,再乘3!×3!,结果略大于1e6。
(4)解数独:主要思路是用dfs暴力搜索完成。
4.设计实现过程:
(1)代码结构:
(2)关键函数:
<1>.解数独:int jsd(int arr[9][9], int row, int col) :不断判定行、列、所在小九宫格是否重复。
<2>.生成数独终局:void generate1to9() :产生9个随机数。数独左上角第一个数是24%9+1=7
void generator():生成不重复的数独终局。
(3)单元测试:
命令行参数判定:-c, -s, -abc
运行情况判定:-c 1, -c 10000, -c 1000000, -s 文件路径(其中包含1、10000、1000000个用例)
(4)运行分析:从图中可知,打开文件和保存文件占据的时间最多。
(1)生成1000个数独终局:
(2)解1000个20-40个空格的数独
5. 代码说明:
if(argc>1) :当输入的argc>1时才可以运行代码。(这是个坑点,坑了我好久,一直不知道哪里出错了。)
if(argv[1][1]=='s') 当输入s时,要解数独。
else if(argv[1][1]=='c') 当输入是c时,要生成c个数独,并且保存。
for (e = 0; e < 9;e++)
{
for (f = 0; f < 9; f++)
{
fputc(num[e][f]+'0',fp3);
if(f!=8) fputc(' ',fp3);
}
fputc('
',fp3);
} // 文件的保存