ZOJ 2412 Farm Irrigation

题目描述:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1412

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

const int maxn=50;
int r[4]= {0,-1,0,1},c[4]= {1,0,-1,0};
int A[3*maxn+10][3*maxn+10],ch[11][3][3];
int ind[maxn+10][maxn+10];
char s[maxn+10][maxn+10];
int m,n,ans;

void init()
{
    ch[0]= {{0,1,0},{1,1,0},{0,0,0}};
    ch[1]= {{0,1,0},{0,1,1},{0,0,0}};
    ch[2]= {{0,0,0},{1,1,0},{0,1,0}};
    ch[3]= {{0,0,0},{0,1,1},{0,1,0}};
    ch[4]= {{0,1,0},{0,1,0},{0,1,0}};
    ch[5]= {{0,0,0},{1,1,1},{0,0,0}};
    ch[6]= {{0,1,0},{1,1,1},{0,0,0}};
    ch[7]= {{0,1,0},{1,1,0},{0,1,0}};
    ch[8]= {{0,0,0},{1,1,1},{0,1,0}};
    ch[9]= {{0,1,0},{0,1,1},{0,1,0}};
    ch[10]= {{0,1,0},{1,1,1},{0,1,0}};

}

bool charge(int x,int y)
{
    if(x<0||y<0||x>=3*m||y>=3*n||A[x][y]==0) return false;
    return true;
}

void dfs(int x,int y)
{
    A[x][y]=0;
    for(int i=0;i<4;i++)
    {
        int a=x+r[i];
        int b=y+c[i];
        if(charge(a,b)) dfs(a,b);
    }
}


int main()
{
//    freopen("in.txt","r",stdin);
    init();
    while(scanf("%d%d",&m,&n)&&m>0&&n>0)
    {
        ans=0;
        for(int i=0; i<m; i++)
        {
            scanf("%s",s[i]);
        }
        for(int i=0; i<m; i++)
            for(int j=0; j<n; j++)
            {
                ind[i][j]=int(s[i][j]-'A');
            }
        for(int i=0; i<m; i++)
            for(int j=0; j<n; j++)
            {
                int tmp=ind[i][j];
                for(int k=0; k<3; k++)
                    for(int t=0; t<3; t++)
                    {
                        A[3*i+k][3*j+t]=ch[tmp][k][t];
                    }
            }
        for(int i=0;i<3*m;i++)
        for(int j=0;j<3*n;j++)
        {
            if(A[i][j]==1) {
            dfs(i,j);
            ans++;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}


posted on 2011-09-22 21:47  _Clarence  阅读(126)  评论(0编辑  收藏  举报

导航