qq三国华容道算法(拼图问题,8数码问题?)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhangfengz1995/article/details/79048685

qq三国里面的小游戏,不是正经的华容道,貌似学名叫n数码问题,搜的时候好像也有人叫它拼图问题,九宫问题。。。乱七八糟一堆名字。


基本思路,最简单的就是遍历了。

然后各种对遍历的优化,比如启发式,双向遍历什么的。

有个感觉比较有意思的东西是这个问题的可解性,有人通过分析奇偶性得到快速求解可解性的方法。引出了8数码问题的奇偶性互相转换问题。真是6666。

n数码也可以借鉴这个思路,但是和8数码会稍有不同

http://blog.csdn.net/hnust_xiehonghao/article/details/7951173

https://zhuanlan.zhihu.com/p/30873938

http://cncc.bingj.com/cache.aspx?q=%e6%8b%bc%e5%9b%be+%e7%ae%97%e6%b3%95&d=4568489755217928&mkt=zh-CN&setlang=zh-CN&w=_V95LkhzbCEdgn7tKLzZsaFa1wN_LWa4

http://www.cnblogs.com/goodness/archive/2010/05/04/1727141.html

http://blog.csdn.net/u013009575/article/details/17140915


最后,实际实现:

其实这种东西拿python似乎更方便一点

因为核心解n数码算法用c++写的,懒得整python调用c++了。

所以拿qt来截图,分析拼图。

然后IDA*来解拼图

最后输出最优走法。

没有集成模拟鼠标键盘,需要的可以自己整。


以学习为目的,不传播非法程序。。

所以只放出 核心部分 IDA*求解n数码问题

https://github.com/ZhangFengze/QQSanGuoHuaRongDao/


试了试,发现5x5的话一般一分钟多的计算时间。

游戏里面的限制是两三分钟。

这样的话还是比较紧的。

所以代码还需要优化优化。

我想想。。


算法的话,5x5的规模,感觉BFS,A*,DFS保存路径,这些需要保存状态的会爆内存。IDA*应该是最好的思路了。

可以考虑第一次max_depth就搞大一点,然后每次迭代加深不是1,这样虽然求出来不是最优,但是求解可能会快一点?

还有一个优化是可以多线程算,IDA*很方便多线程,利用多核优势。

还有一个思路是干脆把所有5x5的初始状态的解全离线算出来。到时候直接查。

还有上一个思路的变体,算出关键节点的解,然后向关键点靠近。

还有万金油的优化,也整上。O3也整上。静态编译起来。数据改得cache友好些。

还有个思路,玩3x3的时候其实有些小技巧,比如说先把某一行整好了,然后考虑剩下的。

而且整单行好像有点固定套路。把这个套路想出来,应该可以快速求解?但是不一定最优,没关系。

看看别人怎么整吧。5x5貌似是24数码问题



查了查,有人已经写了论文,思路是上面那个套路技巧,先找一个套路解,这个极快。然后再优化套路解。得到一个较优解。

贼快。。。佩服佩服。

这篇http://www.cnki.com.cn/Article/CJFDTOTAL-JYRJ201005081.htm



还有这篇,另一种套路解。厉害厉害

http://www.cnki.com.cn/Article/CJFDTOTAL-XDJS201414006.htm



想了想,套路解法应该还可以这样。

假设我们把上面的几行都写完了,那么最后两行,其实是很简单的。甚至可以求解最优值

那么再扩展一行,只用处理好第一行,就可以达到上面那个简单状态。第一行的处理想一想,然后再同样的方式不断扩展。
展开阅读全文

没有更多推荐了,返回首页