最近在编程之美这本书上面看到了关于连连看的算法,书上讲解了算法原理,于是我就想着自己动手试试写出这个算法。
首先,我们要知道连连看这个算法是判断两个图片之间是否能够消除,如果可以消除,显示两个图片之间的最短路径。
例如:现在要判断A,B两个点所在的图片能不能消除
步骤:
1:判断两张图片是否一样
2:A,B两点连接起来,最多不能出现大于2个拐点,也就是说最多只能出现2个拐点
这里我们不是直接判断A,B之间有多少拐点,而是换个角度看问题。
第一步:
我们把 A 点上下左右能直接连接到的点分别放在容器vecEmpty和vecSolid中,其中vecEmpty是保存没有图片的空点,
vecSolid是保存有图片的实点,这个时候我们就可以遍历vecSolid容器,
假设B点在容器vecSolid中,那就证明A,B之间可以直接连接起来,拐点为0个。
第二步:
如果第一步没有解决,令vecEmpty1 = vecEmpty,我们遍历vecEmpty1容器的空点,每个点都做类似于第一步的步骤,
并且把得到的点也分别加在容器vecEmpty和vecSolid中,这个时候,我们就可以遍历vecSolid容器,
假设B点在容器vecSolid中,那就证明A,B之间可以直接连接起来,拐点为1个。
(这里可能有人会说此时容器vecSolid中也有第一步得到的实心点,为什么这么肯定这里得到的结果拐点一定为1呢?
仔细想想就可以知道,那些点虽然是还在容器内,但是步骤1已经证明那些点里面没有B,所以这里再次检测的时候,那些点依然不会有B点,
如果得到我们预期的结果,只有可能是第二步新加进去的点)
第三步:
如果第二步还没有解决,令vecEmpty2 = vecEmpty - vecEmpty1,我们遍历vecEmpty1容器的空点,每个点都做类似于第一步的步骤,
并且把得到的点也分别加在容器vecEmpty和vecSolid中,这个时候,我们就可以遍历vecSolid容器,
假设B点在容器vecSolid中,那就证明A,B之间可以直接连接起来,拐点为2个。
注意:
我们在以某个点和基础搜索到周围的点的时候,不要直接加入到容器vecEmpty和vecSolid中,先判断容器中有没有这个点,没有就加入,有就不能加入
这里是我自己按照这个思路写的一份完整的连连看算法实现代码,自己做了一个简单的界面测试过,是正确的
所以把算法方面的代码上传供大家参考,有什么不懂的或者有错的地方,欢迎大家提出来一起学习点击打开链接