连连看判断消除算法

最近在编程之美这本书上面看到了关于连连看的算法,书上讲解了算法原理,于是我就想着自己动手试试写出这个算法。

首先,我们要知道连连看这个算法是判断两个图片之间是否能够消除,如果可以消除,显示两个图片之间的最短路径。

例如:现在要判断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中,先判断容器中有没有这个点,没有就加入,有就不能加入

 

这里是我自己按照这个思路写的一份完整的连连看算法实现代码,自己做了一个简单的界面测试过,是正确的

所以把算法方面的代码上传供大家参考,有什么不懂的或者有错的地方,欢迎大家提出来一起学习点击打开链接

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值