软件工程实践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
这是在命令行中运行结果

1225783-20170910215043679-238856361.png

PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划400660
· Estimate· 估计这个任务需要多少时间5001000
Development开发400800
· Analysis· 需求分析 (包括学习新技术)55110
· Design Spec· 生成设计文档450
· Design Review· 设计复审 (和同事审核设计文档)400
· Coding Standard· 代码规范 (为目前的开发制定合适的规范)1040
· Design· 具体设计2050
· Coding· 具体编码00
· Code Review· 代码复审6030
· Test· 测试(自我测试,修改代码,提交修改)60100
Reporting报告6090
· Test Report· 测试报告100
· Size Measurement· 计算工作量2010
· Postmortem & Process Improvement Plan· 事后总结, 并提出过程改进计划4020
合计

转载于:https://www.cnblogs.com/piep/p/7502311.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值