Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1066    Accepted Submission(s): 472


      听我一同学说他做这一道题时用的是并查集,不过我觉得这一题用广搜更容易,一个一个的扫描,将所有与这个集合里面元素有关的都放进队列里,看能形成几个集合。
代码:

 

1
2  //15ms
3  #include<stdio.h>
4 #include<queue>
5 using namespace std;
6 typedef struct node
7 {
8 char data;
9 int x, y;
10
11 }NODE;
12 int mark[60][60];char a[60][60];
13 int main()
14 {
15 int z[11][4][2]={{{-1,0},{0,-1},{0,0},{0,0}},
16 {{0,-1},{1,0},{0,0},{0,0}},
17 {{-1,0},{0,1},{0,0},{0,0}},
18 {{1,0},{0,1},{0,0},{0,0}},
19 {{0,1},{0,-1},{0,0},{0,0}},
20 {{-1,0},{1,0},{0,0},{0,0}},
21 {{-1,0},{1,0},{0,-1},{0,0}},
22 {{-1,0},{0,1},{0,-1},{0,0}},
23 {{1,0},{-1,0},{0,1},{0,0}},
24 {{1,0},{0,1},{0,-1},{0,0}},
25 {{0,1},{0,-1},{1,0},{-1,0}}};
26 NODE cur,next;
27 int m,n,i,j,count,k,tag,t;
28 while(scanf("%d%d",&m,&n)!=EOF)
29 {
30
31 if(m<0 || n<0)
32 break;
33 count=0;
34 for(i=0;i<m;i++)
35 {
36 getchar();
37 for(j=0;j<n;j++)
38 {
39 scanf("%c",&a[i][j]);
40 mark[i][j]=0;
41 }
42 }
43 queue<NODE> qu;
44 for(i=0;i<m;i++)
45 for(j=0;j<n;j++)
46 {
47 if(!mark[i][j])
48 {
49 count++;
50 mark[i][j]=1;
51 cur.data=a[i][j];
52 cur.x=j;
53 cur.y=i;
54 qu.push(cur);
55 while(!qu.empty())
56 {
57 cur=qu.front();
58 qu.pop();
59 for(k=0;k<4;k++)
60 {
61 next.x=cur.x+z[cur.data-'A'][k][0];
62 next.y=cur.y+z[cur.data-'A'][k][1];
63 tag=0;
64 if(next.x>=0&&next.x<n&&next.y>=0&&next.y<m&&!mark[next.y][next.x])
65 {
66 next.data=a[next.y][next.x];
67 for(t=0;t<4;t++)
68 {
69 int x,y;
70 x=next.x+z[next.data-'A'][t][0];
71 y=next.y+z[next.data-'A'][t][1];
72 if(x==cur.x &&y==cur.y)
73 {
74 tag=1;
75 break;
76 }
77 }
78 if(tag)
79 {
80 mark[next.y][next.x]=1;
81 qu.push(next);
82 }
83 }
84 }
85 }
86 }
87 }
88 printf("%d\n",count);
89 }
90 return 0;
91 }
92
93
94