怎样判断你点击的两个相同的图案是否可以消除?---------练练看算法

简介:

   他山之石,可以攻玉。    -------(诗经小雅鹤鸣)     

     练练看是一款非常有意思的游戏,在光棍节的时候记得玩连连看。

     看到屏幕上面一对一对的被消掉,呵呵,心里那感觉就······。

     花了几段小的时间来关注了其中的代码实现。

     可以引进 二维数组相应下标记录按钮(图标)的位置,索引值存储“0” 即按钮为空;

     练练看当中的核心也是最能体现效率的地方

    怎样判断你点击的两个相同的按钮(图案)是否可以消除?

     我们分三种情况分别分析一下:

1)两个相同的图案是相邻的(没有拐弯):

 

具体实现代码如下:

复制代码
//(X0,Y0)是第一次点击的图案坐标   (X1,Y1)是第二次点击图案的坐标

//remove()函数具体实现是擦除图案,并将对应坐标赋值为“0”

if ((x0 == x && (y0 == y + 1 || y0 == y - 1))|| ((x0 == x + 1 ||       x0 == x - 1) && (y0 == y))) { 

successFlag = remove(typeFlag);

}
复制代码

2)两图案之间需要转一个弯;

 

3)两图案之间需要两个拐弯;

 

从复杂的3)情况下手,后面你会发现其实2)情况只是其中的一个特列,判断是否可消除有以下的思路:

对你点击的每两个相同的按钮(即先判断你点击的两个按钮是否相同,接着判断能否相消),对于两按钮能否相消,

可以分为行遍历和列遍历(下面思路适用于行遍历);

1)(在行上)找到和第一个按钮同行的一个空按钮;

2)(在行上)判断第二个按钮同行到空按钮之间是否畅通;

3)(在行上)判断第一个按钮同行到空按钮之间时候通畅;

4)(在列上)判断第一个按钮到第二个按钮在所在那个空按钮列上是否畅通;

 

相应的列遍历只是改变其中的循环参数以及变量的值,就不赘言了。

贴个实现行遍历的代码:

复制代码
 1 //其中的 grid[][] 为二维数组,globeRows 列边界值
 2             for (j = 0; j < globeRows + 2; j++) {   //行遍历
 3                 if (grid[x0][j] == 0) { // 判断第一个按钮同行哪个按钮为空
 4                     //当找到那个空按钮之后,第二个按钮的位置就相当关键,分三种情况
 5                     //第一种情况
 6                     if (y > j) {       // 如果第二个按钮的Y坐标大于空按钮的Y坐标说明第一按钮在第二按钮左边
 7                         for (i = y - 1; i >= j; i--) { // 判断第二按钮左侧直到刚才那个空格之间能不能走通(行比较)
 8                             if (grid[x][i] != 0) {
 9                                 k = 0;
10                                 break;
11                             } else {
12                                 k = 1;
13                             } // K=1说明通过了第一次验证
14                         }
15                         if (k == 1) {
16                             linePassOne();  // 这个函数没有写出但具体实现:
17                                             // 判断第一个按钮到空按钮之间能不能走通(行之间比较)
18                         }
19                     }
20                     //第二种情况
21                     if (y < j) {                       // 如果第二个按钮的Y坐标小于空按钮的Y坐标说明第一按钮在第二按钮右边
22                         for (i = y + 1; i <= j; i++) { // 判断第二按钮右侧直到空按钮之间能不能走通(行之间比较)
23                             if (grid[x][i] != 0) {
24                                 k = 0;
25                                 break;
26                             } else {
27                                 k = 1;
28                             }
29                         }
30                         if (k == 1) {
31                             linePassOne();
32                         }
33                     }
34                     // 第三种情况    ,上面描述的只有一个拐弯的就是这种特殊情况
35                     if (y == j) {
36                         linePassOne();
37                     }
38                 }
39                 // 判断第一个按钮到第二个按钮在刚在所在空按钮的那个列上能不能走通(列之间比较)
40                 if (k == 2) {
41                     // 第二个按钮和第一个按钮在同一行
42                     if (x0 == x) {
43                         successFlag = remove(typeFlag);
44                     }
45                     //第二个按钮在第一个按钮的下面
46                     if (x0 < x) { 
47                         for (n = x0; n <= x - 1; n++) {
48                             if (grid[n][j] != 0) {
49                                 k = 0;
50                                 break;
51                             }
52                             if (grid[n][j] == 0 && n == x - 1) {
53                                 successFlag = remove(typeFlag);
54                             }
55                         }
56                     }
57                     //第二个按钮在第一个按钮的上面
58                     if (x0 > x) { 
59                         for (n = x0; n >= x + 1; n--) {
60                             if (grid[n][j] != 0) {
61                                 k = 0;
62                                 break;
63                             }
64                             if (grid[n][j] == 0 && n == x + 1) {
65                                 successFlag = remove(typeFlag);
66                             }
67                         }
68                     }
69                 }
70             }
复制代码
本文转自Orson博客园博客,原文链接:http://www.cnblogs.com/java-class/archive/2013/06/06/3119302.html,如需转载请自行联系原作者
相关文章
|
6月前
|
机器学习/深度学习 数据采集 监控
机器学习-特征选择:如何使用递归特征消除算法自动筛选出最优特征?
机器学习-特征选择:如何使用递归特征消除算法自动筛选出最优特征?
925 0
|
3月前
|
SQL 算法 Serverless
B端算法实践问题之使用concat_id算子获取用户最近点击的50个商品ID如何解决
B端算法实践问题之使用concat_id算子获取用户最近点击的50个商品ID如何解决
28 1
|
5月前
|
算法
算法特训,AB5 .点击消除BC.149简写单词牛客.除2!牛客.Fibonacci数列
算法特训,AB5 .点击消除BC.149简写单词牛客.除2!牛客.Fibonacci数列
算法入门小题目——点击消除
算法入门小题目——点击消除
|
算法
【算法入门】 有效括号序列|逆波兰表达式求值|点击消除(下)
【算法入门】 有效括号序列|逆波兰表达式求值|点击消除
86 0
|
算法 UED
【算法入门】 有效括号序列|逆波兰表达式求值|点击消除(上)
【算法入门】 有效括号序列|逆波兰表达式求值|点击消除
76 0
|
1月前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
9天前
|
算法 数据安全/隐私保护 索引
OFDM系统PAPR算法的MATLAB仿真,对比SLM,PTS以及CAF,对比不同傅里叶变换长度
本项目展示了在MATLAB 2022a环境下,通过选择映射(SLM)与相位截断星座图(PTS)技术有效降低OFDM系统中PAPR的算法实现。包括无水印的算法运行效果预览、核心程序及详尽的中文注释,附带操作步骤视频,适合研究与教学使用。
|
17天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。
|
18天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。
下一篇
无影云桌面