您的位置:首页 > 其它

hdu 1547 Bubble Shooter(深搜)

2013-12-15 11:46 288 查看
链接: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

;
7 int vis

, 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]==2) continue;
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, 0, sizeof(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、规则理解错。与一个泡泡直接相连的有六个位置,不是四个,也不是八个。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: