1、 项目地址:https://github.com/one-piece-zero/sudoku
2、PSP表格记录的估计耗时
3、解题思路:
- 在拿到这个题目的时候,我最早想到的是大一下学期做的程序语言综合设计实践中的N皇后问题,这两个题目之间有许多的类似之处,行列不能重复,对于这次的题目来说,宫内的数字不能重复,对于N皇后问题来说,斜线部分不能重复。于是我拿起了大一时的解题报告来与这个题目一起分析。首先,对于左上角数字是固定的,那么就可以初始化左上角的数字,然后从第一行的后八位,运用srand函数产生的随机数,运用random_shuffle函数随机排列,第一行的数字分好之后,就从第二行的第一个数开始,随机产生,通过标记flag的值来判断是否与上下左右有所重复,若有所重复,则跳出循环,另取数重新开始,而宫内的数字则通过与前后左右还有3这个倍数的关系来进行检测,这个题目中,我用到了回溯法,当遇到冲突时,就返回上一个步骤,去新数来填,直到整个数独矩阵完成,N皇后问题当初也是用的回溯法解决的,在这次实践中又用到了,还是有所收获的。
4、设计实现过程:
- 在开始的时候,拿到这个题目,想到了当初的N皇后问题,所以理所当然的想到了回溯法,在这次的代码中,我只写了一个函数,这个函数是用来完成整个数独的,我在主函数中先将数独矩阵的第一行完成,接着调用函数,在函数中采用回溯法一步一步完成整个数独矩阵。
5、代码说明
主要思路在注释中有体现
6、运行测试
7、性能分析图
- 从图中可以看出,在这次代码中有两个函数,main主函数和find函数,而明显的主函数占用的CPU要远远高于find函数,而此次使用了回溯算法,所以时间复杂度会较搞一些,对于较大的数字会处理的较慢些。
8、PSP表格记录的实际耗时