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\n",x,y,u,v);
20         if(u<1 || u>H || v<1 || v>W-((u+1)%2)) continue;
21         //printf("%d %d %d %d\n",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\n",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\n",sum-ans1);
76         else
77             printf("0\n");
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("\n");
86         }
87 */
88     }
89     return 0;
90 }
View Code

 

 

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

PS:

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

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

posted @ 2013-12-15 11:46  byluoluo  阅读(303)  评论(0)    收藏  举报