自己思路和答案思路一样这种事情最开心啦~其实不看答案自己应该也能改对 又是把行列搞反了
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
bool type[15][4]={{1,0,0,1},{1,1,0,0},{0,0,1,1},{0,1,1,0},
{1,0,1,0},{0,1,0,1},{1,1,0,1},{1,0,1,1},{0,1,1,1},{1,1,1,0},{1,1,1,1}};
int f[300000],n,m;
char c;
int num[100][100];
void init(int n){
for(int i=1;i<=n;i++) f[i]=i;
}
int find(int x)
{
if(x==f[x]) return x;
int tmp=f[x]; f[x]=find(f[x]);
return f[x];
}
int main()
{
//freopen("cin.txt","r",stdin);
while(~scanf("%d%d",&m,&n))
{
if(m==-1&&n==-1) break;
init(n*m);
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
cin>>c;
num[i][j]=c-65;
//cout<<num[i][j]<<" ";
}
// cout<<endl;
}
int count=n*m;
for(int i=1;i<=m;i++)
for(int j=1;j<n;j++)
{
if(type[num[i][j]][1]&&type[num[i][j+1]][3])
{
int fx=find(i*n-n+j),fy=find(i*n-n+j+1);
if(fx!=fy) {f[fx]=fy;count--;}
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<m;j++)
{
if(type[num[j][i]][2]&&type[num[j+1][i]][0])//就是这里 这里这里~~
{
int fx=find(j*n-n+i),fy=find(j*n+i);
if(fx!=fy) {f[fx]=fy;count--;}
}
}
cout<<count<<endl;
}
return 0;
}