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.1 | Personal 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”开始寻找能够满足数独要求的合法填入,找到后对该格子进行赋值,若没有找到合法的数字,说明前面有错误的填入,此时应该退回到上一格,从没试过的数字里继续尝试,重复上述步骤。