没什么道道 就是麻烦 要仔细
看每个块是什么类型 又能和什么类型的块相连 预处理一下即可
#include <bits/stdc++.h>
using namespace std;
struct node
{
int dir[4];
};
node per[11];
int mp[100][100];
int f[5000];
int n,m;
void init();
void calculate();
void unite(int u,int v);
int getf(int p);
int main()
{
int k;
int i,j,sum;
char ch[100];
init();
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n<0||m<0) break;
for(i=1;i<=n;i++)
{
scanf("%s",ch);
for(j=0;j<m;j++)
{
mp[i][j+1]=ch[j]-'A';
}
}
for(i=1;i<=n*m;i++)
{
f[i]=i;
}
calculate();
sum=0;
for(i=1;i<=n*m;i++)
{
if(f[i]==i) sum++;
}
printf("%d\n",sum);
}
return 0;
}
void init()
{
per[0].dir[0]=1, per[0].dir[1]=1, per[0].dir[2]=0, per[0].dir[3]=0;
per[1].dir[0]=0, per[1].dir[1]=1, per[1].dir[2]=1, per[1].dir[3]=0;
per[2].dir[0]=1, per[2].dir[1]=0, per[2].dir[2]=0, per[2].dir[3]=1;
per[3].dir[0]=0, per[3].dir[1]=0, per[3].dir[2]=1, per[3].dir[3]=1;
per[4].dir[0]=0, per[4].dir[1]=1, per[4].dir[2]=0, per[4].dir[3]=1;
per[5].dir[0]=1, per[5].dir[1]=0, per[5].dir[2]=1, per[5].dir[3]=0;
per[6].dir[0]=1, per[6].dir[1]=1, per[6].dir[2]=1, per[6].dir[3]=0;
per[7].dir[0]=1, per[7].dir[1]=1, per[7].dir[2]=0, per[7].dir[3]=1;
per[8].dir[0]=1, per[8].dir[1]=0, per[8].dir[2]=1, per[8].dir[3]=1;
per[9].dir[0]=0, per[9].dir[1]=1, per[9].dir[2]=1, per[9].dir[3]=1;
per[10].dir[0]=1, per[10].dir[1]=1, per[10].dir[2]=1, per[10].dir[3]=1;
return;
}
void calculate()
{
int next[4][2]={0,-1,-1,0,0,1,1,0};
int i,j,k,tx,ty;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
for(k=0;k<4;k++)
{
tx=i+next[k][0];
ty=j+next[k][1];
if(1<=tx&&tx<=n&&1<=ty&&ty<=m)
{
//printf(" ***%d %d %c %c %d %d*** ",k,(k+2)%2,mp[tx][ty]+'A',mp[i][j]+'A',per[mp[tx][ty]].dir[(k+2)%2],per[mp[i][j]].dir[k]);
if(per[mp[tx][ty]].dir[(k+2)%4]&&per[mp[i][j]].dir[k])
{
unite((tx-1)*m+ty,(i-1)*m+j);
}
}
}
}
//printf("\n");
}
return;
}
void unite(int u,int v)
{
int fu,fv;
fu=getf(u);
fv=getf(v);
if(fu!=fv)
{
f[fv]=fu;
}
return;
}
int getf(int p)
{
if(f[p]==p) return p;
else
{
f[p]=getf(f[p]);
return f[p];
}
}