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

简介:

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

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

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

     可以引进 二维数组相应下标记录按钮(图标)的位置,索引值存储“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/ 
如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】 
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】 
如果,您对我的博客内容感兴趣,请继续关注我的后续博客,我是【Orson】 

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段 声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 

转载:http://www.cnblogs.com/java-class/archive/2013/06/06/3119302.html

目录
相关文章
|
机器学习/深度学习 数据采集 监控
机器学习-特征选择:如何使用递归特征消除算法自动筛选出最优特征?
机器学习-特征选择:如何使用递归特征消除算法自动筛选出最优特征?
1573 0
|
SQL 算法 Serverless
B端算法实践问题之使用concat_id算子获取用户最近点击的50个商品ID如何解决
B端算法实践问题之使用concat_id算子获取用户最近点击的50个商品ID如何解决
94 1
算法特训,AB5 .点击消除BC.149简写单词牛客.除2!牛客.Fibonacci数列
算法特训,AB5 .点击消除BC.149简写单词牛客.除2!牛客.Fibonacci数列
算法入门小题目——点击消除
算法入门小题目——点击消除
|
算法
【算法入门】 有效括号序列|逆波兰表达式求值|点击消除(下)
【算法入门】 有效括号序列|逆波兰表达式求值|点击消除
182 0
|
算法 UED
【算法入门】 有效括号序列|逆波兰表达式求值|点击消除(上)
【算法入门】 有效括号序列|逆波兰表达式求值|点击消除
115 0
|
17天前
|
机器学习/深度学习 算法 新能源
【优化调度】基于matlab粒子群算法求解水火电经济调度优化问题研究(Matlab代码实现)
【优化调度】基于matlab粒子群算法求解水火电经济调度优化问题研究(Matlab代码实现)
|
19天前
|
算法 机器人 定位技术
基于机器视觉和Dijkstra算法的平面建筑群地图路线规划matlab仿真
本程序基于机器视觉与Dijkstra算法,实现平面建筑群地图的路径规划。通过MATLAB 2022A读取地图图像,识别障碍物并进行路径搜索,支持鼠标选择起点与终点,最终显示最优路径及长度,适用于智能导航与机器人路径规划场景。
|
20天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于PSO粒子群优化的XGBoost时间序列预测算法matlab仿真
本程序基于Matlab 2024b实现,结合粒子群优化(PSO)与XGBoost算法,用于时间序列预测。通过PSO优化XGBoost超参数,提升预测精度。程序包含完整注释与操作视频,运行后生成预测效果图及性能评估指标RMSE。
|
17天前
|
传感器 并行计算 算法
【无人机编队】基于非支配排序遗传算法II NSGA-II高效可行的无人机离线集群仿真研究(Matlab代码实现)
【无人机编队】基于非支配排序遗传算法II NSGA-II高效可行的无人机离线集群仿真研究(Matlab代码实现)

热门文章

最新文章