zoukankan      html  css  js  c++  java
  • hdu 1547 Bubble Shooter(深搜)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=1547

    题意:泡泡龙。有H行W列,其中奇数行可放W个泡泡,偶数行可放W-1个泡泡,'a'~'z'代表泡泡颜色,'E'代表该位置为空。

    一个泡泡可与6个位置相连,左上、右上,正左,正右,左下,右下。最后投放的泡泡若与相连泡泡形成3个上的颜色相同的块,则会爆炸。

    爆炸可能会牵连附近颜色不同的块,若这些块不能与第一行的泡泡相连。

    思路:需要两次dfs,第一次先标记出颜色相同,要爆炸的泡泡位置(标记为1)。第二次标记第一行及与第一行相连的未被标记的泡泡位置(标记为2)。

    若标记为1的小于3,则不会爆炸。

    若标记为1的大于或等于3,则用泡泡总数减去标记为2的数量。

     1 #include <cstdio>
     2 #include <cstdlib>
     3 #include <cstring>
     4 #define N 105
     5 
     6 char a[N][N];
     7 int vis[N][N], H, W, h, w, ans, ans1, sum;
     8 int dir1[6][2] = {{-1,-1},{1,0},{-1,0},{1,-1},{0,1},{0,-1}}; //
     9 int dir2[6][2] = {{-1,0},{-1,1},{1,0},{1,1},{0,1},{0,-1}}; //
    10 void dfs(int x, int y)
    11 {
    12     for(int i=0; i<6; i++)
    13     {
    14         int u, v;
    15         if(x%2==1)
    16             {u = x + dir1[i][0], v = y + dir1[i][1];}
    17         else
    18             {u = x + dir2[i][0], v = y + dir2[i][1];}
    19         //printf("pre:%d %d %d %d ",x,y,u,v);
    20         if(u<1 || u>H || v<1 || v>W-((u+1)%2)) continue;
    21         //printf("%d %d %d %d ",x,y,u,v);
    22         if(vis[u][v]==1 || a[u][v]!=a[x][y]) continue;
    23         vis[u][v] = 1; ans++;
    24         dfs(u,v);
    25     }
    26 }
    27 void dfs1(int x, int y)
    28 {
    29     for(int i=0; i<6; i++)
    30     {
    31         int u, v;
    32         if(x%2==1)
    33             {u = x + dir1[i][0], v = y + dir1[i][1];}
    34         else
    35             {u = x + dir2[i][0], v = y + dir2[i][1];}
    36         if(u<1 || u>H || v<1 || v>W-((u+1)%2)) continue;
    37         //printf("%d %d %d %d ",x,y,u,v);
    38         if(a[u][v]=='E' || vis[u][v]==1 || vis[u][v]==2continue;
    39         vis[u][v] = 2; ans1++;
    40         dfs1(u,v);
    41     }
    42 }
    43 int main()
    44 {
    45     while(scanf("%d%d%d%d",&H,&W,&h,&w)!=EOF)
    46     {
    47         memset(vis, 0sizeof(vis));
    48         for(int i=1; i<=H; i++)
    49         {
    50             scanf("%s",a[i]+1);
    51         }
    52         sum = 0;
    53         for(int i=1; i<=H; i++)
    54         {
    55             for(int j=1; j<=W-((i+1)%2); j++)
    56             {
    57                 if(a[i][j]!='E') sum++;
    58             }
    59         }
    60 
    61         vis[h][w] = 1; ans = 1;
    62         dfs(h,w);
    63 
    64         int markx = 1, marky = 0; ans1 = 0;
    65         for(int i=1; i<=W; i++)
    66         {
    67             if(a[1][i]!='E' && vis[1][i]==0)
    68             {
    69                 marky = i; vis[markx][marky] = 2; ans1++;
    70                 dfs1(markx, marky);
    71             }
    72         }
    73 
    74         if(ans>2)
    75             printf("%d ",sum-ans1);
    76         else
    77             printf("0 ");
    78 /*
    79         for(int i=1; i<=H; i++)
    80         {
    81             for(int j=1; j<=W-((i+1)%2); j++)
    82             {
    83                 printf("%d ",vis[i][j]);
    84             }
    85             printf(" ");
    86         }
    87 */
    88     }
    89     return 0;
    90 }
    View Code

    -----------------------------

    PS:

    1、题目看错。每行宽度是定长的。

    2、规则理解错。与一个泡泡直接相连的有六个位置,不是四个,也不是八个。

  • 相关阅读:
    关于this关键字
    Java元注解
    缩点+spfa最长路【bzoj】 1179: [Apio2009]Atm
    使用Windows API进行串口编程
    串口编程基础知识
    设计模式--代理模式
    用Java实现断点续传的基本思路和代码
    断点续传的原理
    JAVA的StringBuffer类
    StringBuilder用法
  • 原文地址:https://www.cnblogs.com/byluoluo/p/3475109.html
Copyright © 2011-2022 走看看