0、写在最前面的话
GitHub网址:https://github.com/bittanyi7/fuzzy-spoon
感谢以下的博客对于我的项目的启发和帮助:
2.
https://blog.csdn.net/xiaocainiaoshangxiao/article/details/13996459 (C语言命令行参数的使用)
3.
https://www.cnblogs.com/saolv/p/7793379.html(C语言文件操作详解)
特别感谢沈大佬对于数独生成的思路,以及性能方面的改进的思路,大家可以有兴趣看看他的博客
1、预计分析
很惭愧说实话,我刚开始知道了大致的思路然而一直没有动手去实现它。我以为两周时间足够了,然后我就去忙其他的东西了。然而到昨天4月8号,他们突然告诉我三周截至马上要到了,我才开始写代码。
2、预计花费时间,我并没有按照老师的那种分析。这次的项目比较简单,代码量不是很多,我还是按照面向过程的分析方法进行编写代码。表格我没有做,如果都考虑那些东西的话有点畏首畏尾的意思,所以并没有做明确的规划。希望以后的游戏开发工程中能多给点操作的机会。
3、刚拿到题目的时候,下午上课沈大佬就已经开始啪啪啪写代码了。课上沈大佬说了一下这个生成数独的思路,很受用。
1)数独里面任意交换两种数字得到的新的数独仍然是成立的。比如将数独中所有的2和4进行交换,得到的就是新的数独且仍然成立
2)数独九宫格的任意两行或者两列进行交换也还是一个成立的新的数独
3) 综上数字交换交换顺序有8!种 这样有4w多总换法,而九宫格内的交换一个九宫格有6中三个九宫格有6^3种。结合这两个完全就够100w种数独的生成只需要一个数独作为模板
4) 解数独我采用了 回溯法进行暴力搜索,先将空行存下来进行暴力求解,在这里不做累述。
4、有了上面的思路我就开始写代码(大雾,有思路三周后开始写)。主要的需要操作重点的就是8!全排列的生成。我一开始的想法是用shuffle函数打乱顺序,洗他个1e6次,后面苦于,如何排除重复的排列,以及效率的问题。后面沈大佬提点我,可以非递归按顺序写出8!全排列,我就又去找了一同博客。后面的工作都是比较小的,我就没花太多的时间在上面。就弄了一个输出函数,一个换行函数。解数独写了一个回溯函数和判断当前是否正确的函数。
5、性能分析
1)刚开头写出来是这生成个样子的,没加什么优化。
2)完事看了沈大佬的博客,收获很多,性能这种东西还是奇技淫巧来的实在
3) 终极更新
4)生成数独,写文件是消耗的大头,所以我用了沈大佬的输出挂,优化比较明显。
5)解数独,我并没有进行优化之类的,沈大佬的方法学不来,这里不做介绍。暴力搜索复杂度在哪里,优化难度有点大。其实可以把全排列先存起来,到时候在从里面读取文件,感觉这样优化还是不够明显,还是开多线程来得实在。
6、代码说明如果代码不够暴力那么就毫无意义
1)回溯求解数独
7、实际花费时间——一次昏头昏脑的编程
这次代码部分大概花了8小时写完最初版本,测试优化什么的又化了8个小时。
8、拓展阅读
在找资料的时候看到了很多有意思的博客,和大家分享一下:
9、总结
这次弄得头昏脑胀的,出去玩刚回来就说要截至了就很难受,以后不要弄得这么自作孽。我一开始以为这个很复杂,没想到一下午加一晚上就写完了。
还是多要和前人和大佬交流,省下自己造轮子的时间,少走点弯路。
GitHub真是个好东西,有意思。
PS:CSDN的编辑器莫名其妙会有bug,妈耶,为什么后面网址没法选择起来。