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

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

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

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

     可以引进 二维数组相应下标记录按钮(图标)的位置,索引值存储“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

上一篇:[leetcode/lintcode 题解] 算法面试真题详解:最大值在界内的子数组个数


下一篇:[leetcode/lintcode 题解] 算法面试高频题详解:查找和替换模式