zoukankan      html  css  js  c++  java
  • hdu 1547 Bubble Shooter

    题目大意:

      泡泡龙是一款十分受欢迎的游戏。你能在因特网上找到许多版本的泡泡龙。游戏的目标是清除屏幕中泡泡。每次你可以发射一个泡泡到一个区域,如果有三个或者更多的相同颜色的泡泡在一起(包括你刚刚发射上去的),它们就会被引爆。第一次爆炸后,如果一些泡泡与最顶上一行的泡泡断开了,它们同样也会爆炸。

      在本题的问题中,是将给你一个随机的泡泡区域和最近发射上去的泡泡坐标。你的程序任务是输出一共有多少个泡泡会爆炸。

                                       

    输入:

      将有许多组测试数据。每组测试将以四个整数开始:H(区域的高度,2 <= H <= 100),W(区域的宽度,2 <= W <= 100,在上面的图片中,W是10),h(最近发射上去的泡泡的竖直位置,计数方式从顶部至底部,最顶部为第1行),w(最近发射上去的泡泡的水平位置,计数方式从左至右,最左边为第1列)。

      接下来后面跟着H行,奇数行包含W个字符,偶数行包含W-1个字符(参考上面的图片)。每个字符要么是‘a’到‘z’中的一个小写字母,表明在这个位置上泡泡的颜色,要么是一个字母‘E’,表明一个空位置。你可以认为给出的测试例子符合实际游戏情况,没有bug(所有的泡泡直接或者间接与最顶上的一行的泡泡相连,最近发射上去的泡泡的位置不为空)。

    输出:

      对于每个测试,输出一个整数,表明有多少泡泡会爆炸。

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <string.h>
      4 
      5 const int oddDir[6][2] = { { -1, -1 }, { -1, 0 }, { 0, 1 }, { 1, 0 }, { 1, -1 }, { 0, -1 } }; //奇数行泡泡的移动的方向
      6 const int evenDir[6][2] = { { -1, 0 }, { -1, 1 }, { 0, 1 }, { 1, 1 }, { 1, 0 }, { 0, -1 } };  //偶数行泡泡的移动的方向
      7 const int N = 110;
      8 char board[N][N]; //棋盘
      9 bool visit[N][N]; //记录访问泡泡的情况
     10 int H, W, h, w;   //棋盘高度、棋盘宽度、起始点(h-1, w-1)
     11 char bubbleColor; //记录起始的泡泡颜色
     12 int bubbles;      //记录炸掉的泡泡数量
     13 
     14 /* 初始化函数 */
     15 void init(void)
     16 {
     17     h -= 1; //题目给出的坐标是从1开始计数,程序中的坐标从0开始,因此处理一下题目给出的坐标
     18     w -= 1;
     19     bubbles = 0;
     20     memset(board, 0, sizeof(board));
     21     memset(visit, 0, sizeof(visit));
     22 }
     23 
     24 /* 第一种dfs搜索,从(h,w)开始出发,记录与(h,w)位置相邻并且颜色相同的泡泡数量(记录到bubbles里头) */
     25 void dfs(int row, int col)
     26 {
     27     int r, c;
     28     for (int i = 0; i < 6; ++i)
     29     {
     30         if (0 == (row+1) % 2)//偶数行
     31         {
     32             r = row + evenDir[i][0];
     33             c = col + evenDir[i][1];
     34         }
     35         else                 //奇数行
     36         {
     37             r = row + oddDir[i][0];
     38             c = col + oddDir[i][1];
     39         }
     40         if (0 <= r && r < H && 0 <= c && c < W && false == visit[r][c] && bubbleColor == board[r][c])
     41         {
     42             visit[r][c] = true;
     43             bubbles++;
     44             dfs(r, c);
     45         }
     46     }
     47 }
     48 
     49 /* 第二种dfs搜索,从(row,col)出发,count:记录所有与(row,col)相邻的没有爆炸的泡泡数量; heigth:记录这些泡泡能连接到的最顶层的泡泡行数*/
     50 void dfsPro(int row, int col, int &count, int &height)
     51 {
     52     int r, c;
     53     for (int i = 0; i < 6; ++i)
     54     {
     55         if (0 == (row + 1) % 2)//偶数行
     56         {
     57             r = row + evenDir[i][0];
     58             c = col + evenDir[i][1];
     59         }
     60         else                   //奇数行
     61         {
     62             r = row + oddDir[i][0];
     63             c = col + oddDir[i][1];
     64         }
     65         if (0 <= r && r < H && 0 <= c && c < W && false == visit[r][c] && 'a' <= board[r][c] && board[r][c] <= 'z')
     66         {
     67             visit[r][c] = true;
     68             count++;
     69             if (height > r) //如果遇到的泡泡行数比之前的行数要小,就更新,表示这一堆相连的泡泡所能连接到的最上面泡泡的行数
     70                 height = r; 
     71             dfsPro(r, c, count, height);
     72         }
     73     }
     74 }
     75 
     76 int main(void)
     77 {
     78     while (scanf("%d %d %d %d", &H, &W, &h, &w) != EOF)
     79     {
     80         init();
     81         for (int i = 0; i < H; ++i)
     82         {
     83             scanf("%s", board[i]);
     84             for (int j = 0; j < W; ++j)
     85                 if ('E' == board[i][j]) //处理'E'方便后面对空位置操作统一
     86                     board[i][j] = '';
     87         }
     88 
     89         //搜索之前,先初始化bubbles,bubbleColor,visit[h][w]
     90         bubbles++;
     91         bubbleColor = board[h][w];
     92         visit[h][w] = true;
     93 
     94         //第一种dfs
     95         dfs(h, w);
     96 
     97         //泡泡数至少大于等于3,泡泡才会爆炸
     98         if (bubbles <= 2) 
     99         {
    100             printf("0
    ");
    101             continue;
    102         }
    103 
    104         for (int i = 0; i < H; ++i)
    105             for (int j = 0; j < W; ++j)
    106                 if (false == visit[i][j] && 'a' <= board[i][j] && board[i][j] <= 'z')
    107                 {
    108                     //搜索之前,先初始化count,row,visit[i][j]
    109                     int count = 1;
    110                     int row = i;
    111                     visit[i][j] = true;
    112 
    113                     //第二种dfs搜索
    114                     dfsPro(i, j, count, row);
    115 
    116                     //当row不为0的时候,表示这堆泡泡没有与最顶层的泡泡相连,全部会爆炸
    117                     if (row > 0) 
    118                         bubbles += count;
    119                 }
    120 
    121         printf("%d
    ", bubbles);
    122     }
    123     return 0;
    124 }
  • 相关阅读:
    jquery animate()方法 语法
    jquery unload方法 语法
    jquery undelegate()方法 语法
    jquery unbind()方法 语法
    jquery trigger() 方法 语法
    jquery toggle()方法 语法
    jquery change() 函数 语法
    jquery blur()函数 语法
    jquery bind()方法 语法
    jquery checked选择器 语法
  • 原文地址:https://www.cnblogs.com/yongqiang/p/5689464.html
Copyright © 2011-2022 走看看