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/
试了试,发现5×5的话一般一分钟多的计算时间。
游戏里面的限制是两三分钟。
这样的话还是比较紧的。
所以代码还需要优化优化。
我想想。。
算法的话,5×5的规模,感觉BFS,A*,DFS保存路径,这些需要保存状态的会爆内存。IDA*应该是最好的思路了。
可以考虑第一次max_depth就搞大一点,然后每次迭代加深不是1,这样虽然求出来不是最优,但是求解可能会快一点?
还有一个优化是可以多线程算,IDA*很方便多线程,利用多核优势。
还有一个思路是干脆把所有5×5的初始状态的解全离线算出来。到时候直接查。
还有上一个思路的变体,算出关键节点的解,然后向关键点靠近。
还有万金油的优化,也整上。O3也整上。静态编译起来。数据改得cache友好些。
还有个思路,玩3×3的时候其实有些小技巧,比如说先把某一行整好了,然后考虑剩下的。
而且整单行好像有点固定套路。把这个套路想出来,应该可以快速求解?但是不一定最优,没关系。
看看别人怎么整吧。5×5貌似是24数码问题
查了查,有人已经写了论文,思路是上面那个套路技巧,先找一个套路解,这个极快。然后再优化套路解。得到一个较优解。
贼快。。。佩服佩服。
这篇http://www.cnki.com.cn/Article/CJFDTOTAL-JYRJ201005081.htm
还有这篇,另一种套路解。厉害厉害
http://www.cnki.com.cn/Article/CJFDTOTAL-XDJS201414006.htm
想了想,套路解法应该还可以这样。
假设我们把上面的几行都写完了,那么最后两行,其实是很简单的。甚至可以求解最优值
那么再扩展一行,只用处理好第一行,就可以达到上面那个简单状态。第一行的处理想一想,然后再同样的方式不断扩展。