目录
一、Github项目地址
项目地址:
https://github.com/XCyclone/PersonalProject-Sudoku
二、PSP估计
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | |
·Estimate | ·估计这个任务需要多少时间 | 60 | |
Development | 开发 | 1560 | |
·Analysis | ·需求分析(包括学习新技术) | 120 | |
·Design Spec | ·生成设计文档 | 60 | |
·Design Review | ·设计复审(和同事审核设计文档) | 60 | |
·Coding Standard | ·代码规范(为目前的开发制定合适的规范) | 40 | |
·Design | ·具体设计 | 60 | |
·Coding | ·具体编码 | 900 | |
·Code Review | ·代码复审 | 120 | |
·Test | ·测试(自我测试,修改代码,提交修改) | 200 | |
Reporting | 报告 | 380 | |
·Test Report | ·测试报告 | 120 | |
·Size Measurement | ·计算工作量 | 60 | |
·Postmortem & Process Improvement Plan | ·事后总结,并提出过程改进计划 | 200 | |
合计 | 2000 |
三、解题思路描述
本项目可以分为三大块:
- 确定终局生成、数独求解的算法
- 进行代码测试、性能分析
- 进行版本管理、项目规范
3.1、 生成终局
生成终局部分主要有如下几个条件:
- 生成的数独终局不重复
- 生成个数在1到1e6之间
- 文件内的格式:数与数之间由空格分开,终局与终局之间空一行,行末无空格
3.1.1、暴力搜索——回溯法
对于生成不重复的满足所在行、所在列、所在3*3方格内均无重复数字的终局,首先想到的肯定是暴力搜索,对于每一个空尝试填入符合规则的数,然后递归求解,这样可以保证生成有效终局并且不重复,但经过测试这样在生成1e6的条件下速度较慢。
3.1.2、模板法
由于暴力搜索速度较慢,所以想尝试其他方法,经过在网上的相关算法的搜索,发现了一种较为简单便捷的生成方法——模板法。参考链接:数独终盘生成的几种方法、数独终盘模板
设置一个固定的字母模板,通过对模板中不同字母的赋值,可以生成不同的终局。由于终局的第一位为(2+1)%9+1 = 4(学号后两位相加%9+1)剩下的八位可以通过递归在1~3、5~9之间顺序赋值,这样可以产生8!=40320个终局。采用模板如下:
i | g | h | c | a | b | f | d | e |
c | a | b | f | d | e | i | g | h |
f | d | e | i | g | h | c | a | b |
g | h |