软件工程实践2017第二次作业
github:https://github.com/hhhyg/world
首先我们知道,整个大九宫格(九九八十一格)中我们只能填入数字1-9,而我们看到的是横行、竖行和小九宫格都是九格,也就是说,我们在横行、竖行和小九宫格都必须使用到这九个数字。
解题思路1:
若我们要生成一组数独完全解,那如果按传统的回溯方法来产生,那我们首先会从第一个方格(从左至右,从上至下)开始,先从1-9九个数字中选取一个数字填入该处,然后我们再从第二个方格开始,选取八个数字(按数独规则不能重复,则要除去刚刚填入的一个数字)中的一个,依此下去选填数字……当然后续方格中选择的数字,都会因为数独规则,使其所在横行、竖行和小九宫格中,其他已填方格中的数字对该处可填入的数字产生不同的条件约束。某种情况下,我们可能发现填到某格时,由于数独规则约束我们已经没有数字可以填入该处了,这时候我们就要开始回溯了,撤销上一步填入的数字,重新选择一个数字填入上一步的方格,然后继续开始本次的填数,若不行还得继续回溯。有时会因为某种制约,导致我们要不停回溯撤销重填.
思路2:
数独有九个九宫格,先填其中一个九宫格,按题目要求,先填第一个九宫格。因为左上角第一个固定,所有8!=40320种变换,通过交叉变换方法,能每个1~9排列能生成25种不同数独,所以满足n<=1000000。
因为没有学过用c'c++写随机数所以我就选择了第二种思路。
int main()
{
int i;
int a[9];
srand ( time(NULL));
for (i=0;i<9;i++)
{
a[i]=rand()%10;
printf("%d ",a[i]);
}
i=rand()%10;
printf("\n%d\n",a[i]);
return 0;
}这是上网查得随机数的代码,暂时还看不懂srand等作用所以就没用思路1
这是在命令行中运行结果
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 400 | 660 |
· Estimate | · 估计这个任务需要多少时间 | 500 | 1000 |
Development | 开发 | 400 | 800 |
· Analysis | · 需求分析 (包括学习新技术) | 55 | 110 |
· Design Spec | · 生成设计文档 | 45 | 0 |
· Design Review | · 设计复审 (和同事审核设计文档) | 40 | 0 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 40 |
· Design | · 具体设计 | 20 | 50 |
· Coding | · 具体编码 | 0 | 0 |
· Code Review | · 代码复审 | 60 | 30 |
· Test | · 测试(自我测试,修改代码,提交修改) | 60 | 100 |
Reporting | 报告 | 60 | 90 |
· Test Report | · 测试报告 | 10 | 0 |
· Size Measurement | · 计算工作量 | 20 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 40 | 20 |
合计 |