程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu 1198 Farm Irrigation(搜索+並查集)

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

編輯:C++入門知識

/* 這個題我是用搜索過的 本來是想用並查集做,但是始終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)
            ans++;*/
    printf("%d\n",ans);
}
int main()
{
    while(scanf("%d %d",&n,&m)==2)
    {
        if(n<0||m<0) break;
        memset(map,0,sizeof(map));
        for(int i = 0; i < n*m; i++)
            p[i] = i;
        for(int i = 0; i < n; i++)
        {
            scanf("%s",s[i]);
            for(int j = 0; j < m; j++)
                build(i,j);
        }
        solve();
    }
    return 0;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved