自己思路和答案思路一样这种事情最开心啦~其实不看答案自己应该也能改对 又是把行列搞反了敲打

#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;
}