个人项目-数独的生成与求解(1)

Github项目地址

https://github.com/yudingxi/sudoku

项目简介

要求

实现一个命令行程序,程序能够:
1.生成不重复的数独终局文件
2.读取文件内的数独问题,求解并将结果输出到文件

生成终局

在命令行中使用-c参数加数字N(1<=N<=1000000)控制生成数独终局的数量,例如:suduku.exe -c 20
将生成的数独终局用一个文本文件的形式保存起来,每次生成的txt文件需要覆盖上次生成的txt文件。要求生成数独矩阵时,左上角第一个数字为(学号后两位相加)% 9 + 1

求解数独

在命令行中使用-s参数加文件问的形式求解数独,并将结果输出至文件,例如:sudoku.exe -s absolute_path_of_puzzlefile

PSP表格

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

解题思路

生成终局

拿到题目后首先思考如何能够生成特定数量的不同的数独终局,在网上查找到一些资料后受到启发,数独第一行由数字1~9随机排列生成,之后的8行依次由第一行向右移动3、6、1、4、7、2、6、8生成,生成一个完整数独终局后,还可以通过行列的交换变成不同的数独终局。左上角数字固定为(3 + 1)% 9 + 1 = 5,故第一行共有8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 40320种可能,为保证3 * 3的矩阵中没有重复的数字,行交换只能在2 ~ 3行,4 ~ 6行,7 ~ 9行内部交换,共有2 * 6 * 6 = 72种组合,则目前为止能够生成的数独终局数量为40320 * 72 = 2903040 > 1000000,能够满足题目的要求。
整理思路:
(1)首先生成第一行。第一行第一个数字恒为5,剩下的8个数字通过全排列进行排放。
(2)生成一个数独终局。因为想要简化代码,可以先规定一个模板,第一行的数字与模板相互对应,之后可以直接使用它们之间的映射关系来生成一个终局。(3)行交换。每个终局进行行交换可以生成72个终局。

求解数独

数独的求解采用深度优先算法,每个格子里的数字通过暴力枚举的方式确定。把空的格子找出来,从第一个格子开始从“1”开始寻找能够满足数独要求的合法填入,找到后对该格子进行赋值,若没有找到合法的数字,说明前面有错误的填入,此时应该退回到上一格,从没试过的数字里继续尝试,重复上述步骤。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值