hdu 1198 Farm Irrigation

并查集 过了

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
bool pipe[][4]= {1,1,0,0,
                 0,1,1,0,
                 1,0,0,1,
                 0,0,1,1,
                 0,1,0,1,
                 1,0,1,0,
                 1,1,1,0,
                 1,1,0,1,
                 1,0,1,1,
                 0,1,1,1,
                 1,1,1,1
                };
int n, m;
char map[55][55];
int dx[]= {0,-1,0,1};
int dy[]= {-1,0,1,0};
int fa[2601];
bool vis[2601];
void init()
{
    int i;
    for(i=0; i<n*m; i++)
        fa[i]=i;
}
bool can(int x,int y)
{
    if(x<0||y<0||x>=n||y>=m) return false;
    return true;
}
int find(int x)
{
    if(x==fa[x]) return fa[x];
    return fa[x]=find(fa[x]);
}
void solv(int x,int y)
{
    int i, nx, ny, num1, num2, f1, f2;
    num1=x*m+y;
    int aa, bb;
    aa=map[x][y]-'A';
    for(i=0; i<4; i++)
    {
        nx=dx[i]+x, ny=dy[i]+y;
        if(!can(nx,ny)) continue;
        num2=nx*m+ny;
        bb=map[nx][ny]-'A';
        if(pipe[aa][i]&&pipe[bb][(i+2)%4])
        {
            f1=find(num1), f2=find(num2);
            fa[f1]=f2;
        }
    }

}
int main()
{
    int i, j, y;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        if(n<0||m<0) break;
        for(i=0; i<n; i++)
            for(j=0; j<m; j++)
                scanf(" %c",&map[i][j]);
        init();
        for(i=0; i<n; i++)
            for(j=0; j<m; j++)
                solv(i,j);
        int ans=0;
        memset(vis,0,sizeof(vis));
        for(i=0; i<n*m; i++)
        {
            y=find(i);
            if(!vis[y])
                ans++;
            vis[y]=true;
        }
        printf("%d\n",ans);
    }
    return 0;
}


posted @ 2013-08-20 15:43  Ink_syk  阅读(97)  评论(0编辑  收藏  举报