Github项目地址:
https://github.com/ARLENDAN/sudoku
解题思路:
- 刚开始看到题目没有太多思路,试着做了几道简单的数独题目之后,也上网了搜索类似的解题思路,想到用递归的方法暴力求解,用c和c++写出相应代码,之后遇到的一些问题,着手修改bug,问问同学查找资料,慢慢调试,勉强做出了题目。
设计实现:
- 首先判断第i行、第j列的数是否能设为k,如果是则设为k,并创建求解的函数,求出第n个数的行数和列数,同时进行递归判断直到满足要求,如果到第80个格子则输出可行解,不是则接着进行判断,求出下一个格子的数,直到结束。
主要代码:
void Shudu(int a[9][9],int n)
{
if(Num==result) return;
int t[9][9];
int i,j;
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
t[i][j]=a[i][j];
}
i=n/9; j=n%9;
if(a[i][j] != 0)
{
if(n == 80)
{result++;print(t);}
else
Shudu(t,n+1);
}
else
{
for(int k=1;k<=9;k++)
{
bool flag=check(t,i,j,k);
if(flag)
{
t[i][j]=k;
if(n == 80)
{result++;print(t);}
else
Shudu(t,n+1);
t[i][j]=0;
}
}
}
}
测试运行:
性能分析:
测试数据100
各个模块上预计和实际花费的时间:
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 80 |
Estimate | 估计任务时间 | 30 | 45 |
Development | 开发 | 500 | 600 |
Analysis | 需求分析 | 120 | 150 |
Design | 生成设计文档 | 60 | - |
Design Review | 设计复审 | 120 | - |
Coding Standard | 代码规范 | 60 | - |
Design | 具体设计 | 60 | 80 |
Coding | 具体编码 | 120 | 150 |
Code Review | 代码复审 | 60 | 40 |
Test | 测试 | 100 | 150 |
Reporting | 报告 | 120 | 100 |
Test Repor | 测试报告 | 30 | 45 |
Size Measurement | 计算工作量 | 60 | - |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 60 | 65 |
合计 | 1560 | 1505 |
反思:
- 做的过程整道题的思路如果不看网上的资料,很难自己得出解法,想到要用递归的方法实现但是具体的步骤并不能够很清晰的得出,希望通过之后花更多时间的学习来巩固之前遗忘的知识,和尝试用其他更好的方法解决题目。过程中也并没有严格按照PSP表中的步骤进行解题。