当前位置:编程学习 > C/C++ >>

hdu 1198 Farm Irrigation(搜索+并查集)

/* 这个题我是用搜索过的 本来是想用并查集做,但是始终WA不得正解就直接搜索了

*/

#include<cstdio>

#include<cstring>


int n,m;
int dx[]= {0,0,1,-1},dy[]= {1,-1,0,0}; // r l d u
char s[555][555];
int p[555],vis[555][555];
struct Node
{
    int u,d,l,r;
} map[555][555];


int build(int x,int y)
{
    if(s[x][y]=='A')
    {
        map[x][y].u = 1;
        map[x][y].d = 0;
        map[x][y].l = 1;
        map[x][y].r = 0;
    }
    else if(s[x][y]=='B')
    {
        map[x][y].u = 1;
        map[x][y].d = 0;
        map[x][y].l = 0;
        map[x][y].r = 1;
    }
    else if(s[x][y]=='C')
    {
        map[x][y].u = 0;
        map[x][y].d = 1;
        map[x][y].l = 1;
        map[x][y].r = 0;
    }
    else if(s[x][y]=='D')
    {
        map[x][y].u = 0;
        map[x][y].d = 1;
        map[x][y].l = 0;
        map[x][y].r = 1;
    }
    else if(s[x][y]=='E')
    {
        map[x][y].u = 1;
        map[x][y].d = 1;
        map[x][y].l = 0;
        map[x][y].r = 0;
    }
    else if(s[x][y]=='F')
    {
        map[x][y].u = 0;
        map[x][y].d = 0;
        map[x][y].l = 1;
        map[x][y].r = 1;
    }
    else if(s[x][y]=='G')
    {
        map[x][y].u = 1;
        map[x][y].d = 0;
        map[x][y].l = 1;
        map[x][y].r = 1;
    }
    else if(s[x][y]=='H')
    {
        map[x][y].u = 1;
        map[x][y].d = 1;
        map[x][y].l = 1;
        map[x][y].r = 0;
    }
    else if(s[x][y]=='I')
    {
        map[x][y].u = 0;
        map[x][y].d = 1;
        map[x][y].l = 1;
        map[x][y].r = 1;
    }
    else if(s[x][y]=='J')
    {
        map[x][y].u = 1;
        map[x][y].d = 1;
        map[x][y].l = 0;
        map[x][y].r = 1;
    }
    else if(s[x][y]=='K')
    {
        map[x][y].u = 1;
        map[x][y].d = 1;
        map[x][y].l = 1;
        map[x][y].r = 1;
    }
}
int insert(int nx,int ny,int x,int y,int d)
{
    if(d==0)
    {
        if(map[x][y].r&&map[nx][ny].l)
            return 1;
    }
    else if(d==1)
    {
        if(map[x][y].l&&map[nx][ny].r)
            return 1;
    }
    else if(d==2)
    {
        if(map[x][y].d&&map[nx][ny].u)
            return 1;
    }
    else if(d==3)
    {
        if(map[x][y].u&&map[nx][ny].d)
            return 1;
    }
    return 0;
}
int find(int x)
{
    return x==p[x]?x:p[x]=find(p[x]);
}
int Union(int x,int y)
{
    int nx = find(x);
    int ny = find(y);
    if(nx!=ny)
        p[ny] = nx;
}
int dfs(int x,int y)
{
    for(int i = 0; i < 4; i++)
    {
        int nx = dx[i]+x;
        int ny = dy[i]+y;
        if(nx>=0&&nx<n&&ny>=0&&ny<m)
            if(!vis[nx][ny]&&insert(nx,ny,x,y,i))
            {
                vis[nx][ny] = 1;
                Union(x*m+y,nx*m+ny);
                dfs(nx,ny);
            }
    }
}
int solve()
{
    int ans=0;
    memset(vis,0,sizeof(vis));
    for(int i = 0; i < n; i++)
        for(int j = 0; j < m; j++)
            if(!vis[i][j])
            {
                vis[i][j] = 1;
                ans++;
                dfs(i,j);
            }


    /*for(int i = 0; i < n*m; i++)
        if(p[i]==i)
       &n

补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,