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

简介:

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

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

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

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

     可以引进 二维数组相应下标记录按钮(图标)的位置,索引值存储“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月前
|
SQL 算法 Serverless
B端算法实践问题之使用concat_id算子获取用户最近点击的50个商品ID如何解决
B端算法实践问题之使用concat_id算子获取用户最近点击的50个商品ID如何解决
44 1
|
8月前
|
算法
算法特训,AB5 .点击消除BC.149简写单词牛客.除2!牛客.Fibonacci数列
算法特训,AB5 .点击消除BC.149简写单词牛客.除2!牛客.Fibonacci数列
|
9月前
|
机器学习/深度学习 数据采集 监控
机器学习-特征选择:如何使用递归特征消除算法自动筛选出最优特征?
机器学习-特征选择:如何使用递归特征消除算法自动筛选出最优特征?
1137 0
算法入门小题目——点击消除
算法入门小题目——点击消除
|
算法
【算法入门】 有效括号序列|逆波兰表达式求值|点击消除(下)
【算法入门】 有效括号序列|逆波兰表达式求值|点击消除
100 0
|
算法 UED
【算法入门】 有效括号序列|逆波兰表达式求值|点击消除(上)
【算法入门】 有效括号序列|逆波兰表达式求值|点击消除
84 0
|
1天前
|
传感器 算法
基于GA遗传算法的多机无源定位系统GDOP优化matlab仿真
本项目基于遗传算法(GA)优化多机无源定位系统的GDOP,使用MATLAB2022A进行仿真。通过遗传算法的选择、交叉和变异操作,迭代优化传感器配置,最小化GDOP值,提高定位精度。仿真输出包括GDOP优化结果、遗传算法收敛曲线及三维空间坐标点分布图。核心程序实现了染色体编码、适应度评估、遗传操作等关键步骤,最终展示优化后的传感器布局及其性能。
|
2天前
|
机器学习/深度学习 算法 安全
基于深度学习的路面裂缝检测算法matlab仿真
本项目基于YOLOv2算法实现高效的路面裂缝检测,使用Matlab 2022a开发。完整程序运行效果无水印,核心代码配有详细中文注释及操作视频。通过深度学习技术,将目标检测转化为回归问题,直接预测裂缝位置和类别,大幅提升检测效率与准确性。适用于实时检测任务,确保道路安全维护。 简介涵盖了算法理论、数据集准备、网络训练及检测过程,采用Darknet-19卷积神经网络结构,结合随机梯度下降算法进行训练。
|
3天前
|
算法 数据可视化 数据安全/隐私保护
一级倒立摆平衡控制系统MATLAB仿真,可显示倒立摆平衡动画,对比极点配置,线性二次型,PID,PI及PD五种算法
本课题基于MATLAB对一级倒立摆控制系统进行升级仿真,增加了PI、PD控制器,并对比了极点配置、线性二次型、PID、PI及PD五种算法的控制效果。通过GUI界面显示倒立摆动画和控制输出曲线,展示了不同控制器在偏转角和小车位移变化上的性能差异。理论部分介绍了倒立摆系统的力学模型,包括小车和杆的动力学方程。核心程序实现了不同控制算法的选择与仿真结果的可视化。
31 15
|
3天前
|
算法
基于SOA海鸥优化算法的三维曲面最高点搜索matlab仿真
本程序基于海鸥优化算法(SOA)进行三维曲面最高点搜索的MATLAB仿真,输出收敛曲线和搜索结果。使用MATLAB2022A版本运行,核心代码实现种群初始化、适应度计算、交叉变异等操作。SOA模拟海鸥觅食行为,通过搜索飞行、跟随飞行和掠食飞行三种策略高效探索解空间,找到全局最优解。

热门文章

最新文章