Github项目地址:
https://github.com/wengCH/sudoku
解题思路:
- 数独对我来说不是很陌生,主要采用递归的方法,实现对每个位置填充数进行判断。
- 以人的思想可以对每个位置可填充进行筛选后再进行判断,如12(第一排第2列)处和13处有且仅能填写数字1和2,则在当前3*3,以及第1排其他处不能填写1和2,在利用类似方法递归进行全局可填数字删减,实现减少递归次数,不过我发现,减少可填数字删减的递归似乎更加麻烦。
- 采用随机打乱1-9数字进行递归,实现随机生成数独。
设计实现:
- 首行随机打乱1-9数字,根据附加要求对生成的首个数字进行判断是否符合要求,不符合则重新打乱;
- 从第二行开始,随机打乱1-9数字对当前位置进行填充尝试,成功则递归进行下一位进行填充尝试,该行全部成功则正式填充进行下一行,否则擦除递归中填充项进行重新尝试。
- 当前位填充成功判断:所在3*3位置以及所在纵列横排不存在重复项则为成功。
流程图:
主要代码:
bool put(int line, int index) { if (index > 8) return true; if (table[line][index] != 0) { return put(line, index + 1); } int num[] = { 1,2,3,4,5,6,7,8,9 }; shuffle(num, 9, 1); for (int i = 0; i < 9; i++) { if (test(line, index, num[i]) == true) { table[line][index] = num[i]; if (put(line, index + 1) == true) { return true; } } } table[line][index] = 0; return false; }
测试运行:
性能分析:
PSP:
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 80 | 80 |
Estimate | 估计任务时间 | 20 | 20 |
Development | 开发 | 300 | 360 |
Analysis | 需求分析 | 60 | 120 |
Design | 生成设计文档 | 60 | - |
Design Review | 设计复审 | 60 | - |
Coding Standard | 代码规范 | 30 | 30 |
Design | 具体设计 | 120 | 150 |
Coding | 具体编码 | 240 | 300 |
Code Review | 代码复审 | 60 | 30 |
Test | 测试 | 60 | 60 |
Reporting | 报告 | 100 | 120 |
Test Repor | 测试报告 | 30 | 20 |
Size Measurement | 计算工作量 | 30 | - |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 30 |
合计 | 1280 | 1320 |
总结:
很不错的一次编程实践,编程内容贴近生活(我玩过的小游戏),期间安装VS花了一些时间,较少使用VS功能不熟悉,比如性能分析这些功能模块第一次接触,学到许多。