连连看算法:连连看算法的实现



图-:
0,0,0,0,0,0,0,0,0,0
0,8,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,9,0
0,0,0,0,0,0,0,0,0,0

  这是张连连看地图假设标8和9部分是两张相同
  在矩阵中0表示没有牌大于1表示有牌至于是什么牌那是随机
不要告诉我你说“布局算法”是指如何把牌刚刚好放上去那个无所谓什么
算法你只要首先在地图中准备好偶数个1在布牌时保证每种牌是偶数个
(区别种类牌用大于1数来表示)相应地放入每个1位置上就可以了
、计算地图上这两张牌能不能连通(当然能了哈哈)
这是连连看寻路算法
先定义下两张牌能连充分条件:
1.两张牌是同
2.两张牌的间有条全是0路可以连通
3.这条路不能有两个以上拐角(corner)
满足这 3个条件就可以认为这两张牌是可以连
首先我们依据前两个条件来完成个基本寻路算法
我们是从8到9找出条可以连通路来
那么很明显从8到9其有 4个方向可以选择分别是东西
(e,s,w,n以中国地图方向为标准) 4个方向在第步中我们首先假设 4
个方面没有任何优劣那么我可以任意选择个方向移动那就是东面吧
图 2:
0,0,0,0,0,0,0,0,0,0
0,8,-8,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,9,0
0,0,0,0,0,0,0,0,0,0
我从8向东移动了所以到达了-8位置我的所以可以移到-8位置很明显
-8位置上原来是个0表示没有牌阻挡
那么现在寻路问题就变成了如何从-8找连通9路了! [Page]
说到这里应该明白了吧好多费话有点像娘们在说话
所以目前寻路算法归结为个递归算法基本问题
先从8到找到下个结点-8再用同样规则从-8找到下个结点比如-88
图 3:
0,0,0,0,0,0,0,0,0,0
0,8,-8,-88,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,9,0
0,0,0,0,0,0,0,0,0,0
如果直都能OK没有阻碍最后找到了9就算成功以如要有步不能走下去了
就再退回上个结点向别方向发展都不行就再退回上级结点再向别方向发展
这里逻辑就是递归思想了
用这样思路方法写出来算法已经能在最优情形下用了比如从8到-88哈哈
但在稍微复杂情况下会产生奇多递归结点P4机也跑不动啊我试过哈哈
那么第 2步就是为(e,s,w,n) 4个方向加权也就是让它们的间有个优先权说白了就
是先试哪条路决定法则应该有好几个吧比如以9号位置来看它处于8号东南面
那试路时当然应当优先选择东面和南面再比如9号如果牌8号正东面那当然是选择正东了
再比如当走到-8位置时明显只能再走 3个方向它是不能回头
经过这样处理递归算法生成结点数会明显变少会更快找到成功但性能在最坏情况
下没有本质改变
接下来第 3步我们把第 3个充分条件加进来来解决根本问题
3.这条路不能有两个以上拐角(corner)
按照面向对象思想很自然我给每个在递归算法中生成位置结点加上了个corner属性
来记录这条路到目前为止拐了几个角
这样下子就好办了啊如果发现这个结点已经拐了两个弯时如果要再拐弯或者到达9的前注定
要再增加cornor时就果断over返回上级结点
就说到这儿吧不能再多说了否则就是等于把代码公开了哈哈
注意要把 2、 3两步条件综合起来详细规划个个可能性尽可能提早让不可能结点OVER
这就是提高性能关键吧算法预见性越强性能就越高吧
我们算法在赛扬500256M机器上10万次平均结果是次运算花时不超过0.1毫秒,算得还不


精确速度确实很快在很坏情形下产生最大结点数是690几个这样必然会很快
详细数据已经记不清了

说了这么多了应当明白第步连通算法思路了吧我所知道都已经尽可能讲出来了 [Page]
这个算法完全是自己按照连连看特点度身定做步步test出来所以我个人
觉得是很自然没有任何高深地方完成后性能也很好这才觉得是如此简单相信大家
仔细看看就能写出自己算法来

2、整个地图有没有解???可以连通总牌数?
  这是个问题
  解决这个问题的前我们先来解决提示功能(h)就是为玩家提供提示对牌可以连

  我做法是先把整个地图中相同牌归到也好链表也好
  像这样
4,4,4,4
5,5,5,5
6,6,6,6
......
然后计算比如4个4的间有哪两对可以连至于如何判断能不能连步算法已经实现了吧哈哈
  发现有可以连牌就退出来告诉玩家这两张牌可以连啊!
  这就OK了
  这完全是建立在第步算法基础上实现
  好h功能可以了
  那么整个地图没有解算法是不是出来了?
  是如果找不到可以h那当然就是没有解了!
  把所有可以h对数记下来就是总可以连通数了
  至此和连连看所有算法有关问题解决完毕
第 2步算法实现明显开销要大很多最坏情况应当会是单次连通算法计算量大约50倍以上
(和牌总数量和摆位置有关)还好在服务器上单次连通计算花时间实在太少了
实际运行中完全可以很流畅以上数据都是我估计理论值实际测试时直没有问题
我也懒得计算出真正比较可靠均值了
  
  这部分也是我认为可以有所改进部分公开出来也希望大家能提供些更好更巧妙
思路方法我觉得我计算连通数和有无解思路方法是比较笨思路方法几乎是仗着基本算法快
个算出来有没有更好思路方法呢?期待中我也会再想想太忙太懒主要是懒觉得
可以用就行了
Tags:  高难度的连连看 连连看的算法 连连看算法

延伸阅读

最新评论

发表评论