Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2492 Accepted Submission(s): 1107
//做的最郁闷的一次并查集了,看到这个set()函数就知道哪郁闷了
//
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
bool h1[100][100];
bool h2[100][100];
void set()
{
h1['B']['A']=h1['B']['C']=h1['B']['F']=h1['B']['G']=h1['B']['H']=h1['B']['I']=h1['B']['K']=1;
h1['D']['A']=h1['D']['C']=h1['D']['F']=h1['D']['G']=h1['D']['H']=h1['D']['I']=h1['D']['K']=1;
h1['F']['A']=h1['F']['C']=h1['F']['F']=h1['F']['G']=h1['F']['H']=h1['F']['I']=h1['F']['K']=1;
h1['G']['A']=h1['G']['C']=h1['G']['F']=h1['G']['G']=h1['G']['H']=h1['G']['I']=h1['G']['K']=1;
h1['I']['A']=h1['I']['C']=h1['I']['F']=h1['I']['G']=h1['I']['H']=h1['I']['I']=h1['I']['K']=1;
h1['J']['A']=h1['J']['C']=h1['J']['F']=h1['J']['G']=h1['J']['H']=h1['J']['I']=h1['J']['K']=1;
h1['K']['A']=h1['K']['C']=h1['K']['F']=h1['K']['G']=h1['K']['H']=h1['K']['I']=h1['K']['K']=1;
h2['C']['A']=h2['C']['B']=h2['C']['E']=h2['C']['G']=h2['C']['H']=h2['C']['J']=h2['C']['K']=1;
h2['D']['A']=h2['D']['B']=h2['D']['E']=h2['D']['G']=h2['D']['H']=h2['D']['J']=h2['D']['K']=1;
h2['E']['A']=h2['E']['B']=h2['E']['E']=h2['E']['G']=h2['E']['H']=h2['E']['J']=h2['E']['K']=1;
h2['H']['A']=h2['H']['B']=h2['H']['E']=h2['H']['G']=h2['H']['H']=h2['H']['J']=h2['H']['K']=1;
h2['I']['A']=h2['I']['B']=h2['I']['E']=h2['I']['G']=h2['I']['H']=h2['I']['J']=h2['I']['K']=1;
h2['J']['A']=h2['J']['B']=h2['J']['E']=h2['J']['G']=h2['J']['H']=h2['J']['J']=h2['J']['K']=1;
h2['K']['A']=h2['K']['B']=h2['K']['E']=h2['K']['G']=h2['K']['H']=h2['K']['J']=h2['K']['K']=1;
}
int n,m,t;
int f[2503],r[2503];
int find_f(int x)
{
if(x!=f[x])
{
return f[x]=find_f(f[x]);
}
return x;
}
void union_set(int x,int y)
{
x=find_f(x);
y=find_f(y);
if(x==y) return;
t--;
if(r[x]>r[y])
{
f[y]=x;
}
else if(r[x]<r[y])
{
f[x]=y;
}
else
{
f[y]=x;
r[x]++;
}
}
char s[66][66];
int main()
{
int i,j,a,b;
set();
while(scanf("%d%d",&n,&m),n>0&&m>0)
{
memset(s,0,sizeof(s));//开始忘记这个、WA了
for(i=1;i<=n;i++)
scanf("%s",s[i]+1);
t=n*m;
for(i=1;i<=t;i++)
f[i]=i,r[i]=0;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
if(h1[s[i][j]][s[i][j+1]])
{
a=(i-1)*m+j;
b=a+1;
union_set(a,b);
}
if(h2[s[i][j]][s[i+1][j]])
{
a=(i-1)*m+j;
b=i*m+j; //这个也写错了次,Wa原因之一呀
union_set(a,b);
}
}
printf("%d\n",t);
}
return 0;
}