求找错1

#include<bits/stdc++.h>
using namespace std;
int fa[50005],a[50005];
char str[305][305];
int n,T,temp;
map<int,int> mp;
int getfa(int x){
    //cout<<x<<endl;
    if(!x) return 0;
    if(fa[x]==x) return x;
    return fa[x]=getfa(fa[x]);
}
int main(){
    cin>>T;
    ios::sync_with_stdio(0); 
    while(T--){
        cin>>n;
        memset(fa,0,sizeof(fa));
        for(int i=1;i<=n;i++)
            scanf("%s",str[i]+1);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
            {
                fa[(i-1)*n+j]=(i-1)*n+j;
            }
        mp.clear();    
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
            if(str[i][j]=='1')
            {
                if(str[i][j]=='1' && str[i-1][j]=='1')
                    fa[getfa((i-1)*n+j)]=(i-2)*n+j;
                if(str[i][j]=='1'&& str[i][j-1]=='1' && (getfa((i-1)*n+j))!=getfa((i-1)*n+j-1))
                    fa[getfa((i-1)*n+j)]=(i-1)*n+j-1;
                mp[getfa((i-1)*n+j)]++;    
            }
        temp=0;    
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
            if(str[i][j]=='0'){
                int s=0,x=0,z=0,y=0;
                if((i!=1)&&(str[i-1][j]=='1'))s=(i-2)*n+j;
                if((j!=1)&&(str[i][j-1]=='1'))z=(i-1)*n+j-1;
                if((j!=n)&&(str[i][j+1]=='1')) y=(i-1)*n+j+1;
                if((i!=n)&&(str[i+1][j]=='1')) x=i*n+j;
                s=getfa(s);z=getfa(z);y=getfa(y);x=getfa(x);
                if(s==z) z=0;if(y==s||y==z) y=0;if(x==s||x==z||x==y) x=0;
                temp++;
                if(s) a[temp]+=mp[s];
                if(x) a[temp]+=mp[x];
                if(z) a[temp]+=mp[z];
                if(y) a[temp]+=mp[y]; 
            }
        
        sort(a+1,a+1+temp);
        cout<<temp<<endl;
        for(int i=1;i<=temp;i++)
        cout<<a[i]<<' ';
        cout<<endl;        
                        
    }
} 

 

posted @ 2022-09-23 00:07  dancer16  阅读(8)  评论(0编辑  收藏  举报
描述