个人项目——最后篇

Posted lylist

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了个人项目——最后篇相关的知识,希望对你有一定的参考价值。

一、实现过程:

  首先这个项目我把求解和生成分开写了,生成函数我用回溯法+规则变换来生成终局。先用随机数加回溯生成一个终局,再通过这个终局交换行、列、数字生成1372个终局。这样共需要随机回溯生成1000个左右终局即可。实现过程用了5个函数,分别是dfs回溯生成函数,一个初始化函数,一个随机填数函数,一个变换函数,一个打印函数。dfs函数从1到81号格子填数,然后填的数由随机填数函数决定。一直填满最后判断是否合格,再回溯。再根据这个终局先交换两行,再交换两列最后交换两个数字的方式构造1372个终局。

 技术分享图片

 

         求解函数我用了跳舞链的数据结构,共用了7个函数,分别是删除列函数、恢复列函数、dfs,初始化函数、读入函数,输出函数,找对应关系函数,关系见流程图。

对于单元测试,我是这样设计的:

        1.对于输出到文件的函数,重新打开文件比对结果

        2.对于不输出到文件的函数,比对返回值或参数变化是否符合预期

        3.对于调用其它函数的函数,因为它调用的函数已有专门的单元测试确保其正确,所以可以只检查不是有调用过所产生的变化是否符合预期。

二、性能分析:

         对于求解1000000组空白在30个左右的数独用时30s左右,

 技术分享图片

 

可知时间主要是在删除行和恢复行的过程。一开始性能瓶颈是输入输出速度太慢,经过使用字符读入和字符输出后优化了将近20s。

         对于生成1000000个终局,用时6s左右,

 技术分享图片

时间主要是在变换的过程,原本的性能瓶颈在dfs过程以及输出过于慢,通过使用变换规则和字符输出优化。

三、代码说明:

生成程序:

Dfs过程

 技术分享图片

 

变换过程

 技术分享图片

 

技术分享图片

 

求解程序:技术分享图片

 

读入函数:

 技术分享图片

 

初始化函数:

技术分享图片

 

Dfs求解过程:

技术分享图片

 技术分享图片

 

四、时间表

 技术分享图片

 

以上是关于个人项目——最后篇的主要内容,如果未能解决你的问题,请参考以下文章

个人博客设计框架与插件篇

2016-个人总结

个人项目总结

复用个人项目实现结对编程项目总结

复用个人项目实现结对编程项目

Beta阶段个人总结