前言
本文介绍了一种消消乐游戏的核心规则算法,我已经填了N个标签戳,相信你应该不会因为王者荣耀而搜到这篇文章。我们这里只介绍消消乐中关于三个相同颜色的色块成同一直线(横竖都可)的判别算法。
一、所要解决的问题
我们对问题进行简化,如图1所示,不同类型的色块我们用不同的数字表示,当满足消除条件时,用0表示需要消除的色块(伏笔),即图2.
1 | 1 | 1 | 2 |
1 | 2 | 1 | 1 |
1 | 1 | 2 | 2 |
2 | 1 | 2 | 1 |
0 | 0 | 0 | 2 |
0 | 2 | 1 | 1 |
0 | 1 | 2 | 2 |
2 | 1 | 2 | 1 |
二、问题分析
判别关于三个相同颜色的色块成同一直线的核心问题在于并行的搜索行列中存在的连续相同数字,即在进行列(行)搜索时,不能影响行(列)搜索。举个例子,如图1所示,在进行列搜索的过程中发现第一列前三个元素满足消除的条件,如果这时候对第一列第一个元素进行修改,那么原本满足消除条件的第一行前3个元素,将会因为列搜索时将第一列第一个元素改为0,而影响第一行原本的搜索结果。
三、 解决办法
那么就分而搜索,并行查找。这也是目前很多方法所用到的。即将原矩阵拷贝成两份,分别进行列搜索,行搜索。如图3,4所示


接下来核心问题是,如何整合两个搜索结果。大多数解决方法是以其中一个结果为基础,在此基础上去整合另外一个结果。但这通常耗时且效率低,在这我介绍一种巧妙的方法。在这我们先捋一下我们的需求:让列搜索结果知道行搜索结果消除的元素。那么接下来我观察下图3和图4相乘的结果,如图5所示:
0 | 0 | 0 | |
0 | |||
0 | |||
那如果对非零元素再求根号呢?如图6所示:
0 | 0 | 0 | 2 |
0 | 2 | 1 | 1 |
0 | 1 | 2 | 2 |
2 | 1 | 2 | 1 |
是不是正是我们想要得到的结果呢?这只是用到了0*N=0的原理,这里;
总结
这是我们团队(河南大学RSBD)举办的编程比赛中的一道题,算法虽然很简单,收获却很大,面对这个问题,很开心我的第一想法不是通过暴力for循环的方式解题,而是相信一定存在规律。