hdu 1198 二维并查集

 
 
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX 3000
using namespace std;

char g[51][51];
int m,n;
int fa[MAX];
int pipe[11][4]={{1,0,1,0},{1,0,0,1},{0,1,1,0},{0,1,0,1},{1,1,0,0},{0,0,1,1},{1,0,1,1},{1,1,1,0},{0,1,1,1},{1,1,0,1},{1,1,1,1}};
void init()
{
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            fa[i*n+j]=i*n+j;//i*n+j
        }
    }
}
int parent(int x)
{
    if(fa[x]!=x)fa[x]=parent(fa[x]);
    return fa[x];
}
void Merge(int i,int j)
{
    if(i>0&&pipe[g[i-1][j]-'A'][1]&&pipe[g[i][j]-'A'][0])
    {
        int x=parent(fa[i*n+j]);
        int y=parent(fa[(i-1)*n+j]);
        if(y!=x)fa[y]=x;
    }
    if(j>0&&pipe[g[i][j-1]-'A'][3]&&pipe[g[i][j]-'A'][2])
    {
        int x=parent(fa[i*n+j]);
        int y=parent(fa[i*n+j-1]);
        if(y!=x)fa[y]=x;
    }
}
int main()
{
    //freopen("in.txt","r",stdin);
    while(scanf("%d%d",&m,&n)!=EOF&&(m!=-1&&n!=-1))
    {
        init();
        for(int i=0;i<m;i++)
        {
            scanf("%s",g[i]);
        }
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                Merge(i,j);
            }
        }
        int res=0;
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(fa[i*n+j]==i*n+j)res++;
            }
        }
        printf("%d\n",res);
    }
    return 0;
}
WA的原因很low啊,竟然是数组的 m,n弄烦了, 是i*n+j

你可能感兴趣的:(hdu 1198 二维并查集)