个人项目——数独

个人项目——数独
先贴个Github地址:https://github.com/SeewoLT/Seewo_Project
再附PSP表一份:
Personal Software Process Stages 估计耗时(分钟) 实际耗时(分钟)
计划 30 40
需求分析(包括学习新技术) 0 0
生成设计文档 0 0
设计复审 0 0
代码规范 0 0
具体设计 300 360
具体编码 600 530
代码复审 50 30
测试 200 230
测试报告 60 50
总结改进 60 50
合计 1300 1290
 

解题思路:
说来惭愧,其实小编没啥思路,全都是借鉴网上朋友们的经验分享才勉强规划出接替途径。

该个人项目有两项要求,一个是生成数独终局,还有一个是解数独再把解出来的数独保存到程序根目录中。

第一个要求:
可以知道,对于任何一个1~9的全排列,都可以通过向左或者向右移动固定不变的列数来得到一个新的终局。这样就有9!种终局。
其实,还可以看到,对于任何一个数独终局的1~3行,任意交换这三行的顺序,也是一个数独终局,4~6行和7~9行同理,列也同理。通过这个发现可以在之前的基础上又能有所增加,最终是可以超过1E6个的。

第二个要求:
为了不让脑细胞死得太多,于是我就直接用DFS暴搜的方法把这问题给解了……
DFS部分代码
int Hang = count / 9;
int Lie = count % 9;
if (Plate[Hang][Lie] == 0)
{
for(int i = 1; i <= 9; i++)
if (CHECK(i, Hang, Lie))
{
Plate[Hang][Lie] = i;
SOLVE(count + 1);
}

Plate[Hang][Lie] = 0;
}
else SOLVE(count + 1);


-------------------

总结
这里还是要惭愧地说一下,我到现在还不太会弄VS性能分析工具,所以也就没有再贴代码的性能图示了……

然后再说说我不足的地方,首先我对文档、模块的建立概念完全不清晰,我所有的功能函数都写在一个文件里,其实这与懒脱不了干系……

接着我也了解到一些网友在第二个要求:解数独运用了效率更高的函数功能DLX,将解数独转化成了一个精确覆盖问题,并用Dancing Links X即DLX算法来解决精确覆盖问题,但从来没有仔细揣摩揣摩去实现这项功能。

其实总结起来就是这两个问题,还是有很多遗憾的地方和提升空间。

心路历程和收获
说实话,刚开始写个人项目的时候,那真是摸不着头脑。没办法,最后都是需要朋友们的帮助才有思绪,把一个个“难题”给弄通了。其实与其说是朋友们的帮助,还不如说我网上收资料一个个翻出来呢……
说真心话,我一开始就被系统输入变量参数如何操作给弄懵了,还有如何运用getopt函数也是弄得我焦头烂额。

最后的最后我想总结三点收获:
1.不要拖。
2.不畏难。
3.不停学。

猜你喜欢

转载自blog.csdn.net/weixin_38366821/article/details/80045064