2013年11月8日 星期五

[USACO] 2-1-1 The Castle


/*
ID: 551100k1
LANG: C++
TASK: castle
*/
#include<stdio.h>
int room=0,area=0,add=0,X,Y;
int s[55][55],r[55][55]={0},t[55][55],v[55][55]={0};
int d[10][5]={{-1,0},{0,-1},{1,0},{0,1}};
char C;
void ct(int x,int y,int z){
    int i;
    r[x][y]=z;
    t[x][y]=room;
    for(i=0;i<4;i++){
        if((s[x][y] & (1<<i))==0 && v[x+d[i][1]][y+d[i][0]]==1){
            v[x+d[i][1]][y+d[i][0]]=0;
            ct(x+d[i][1],y+d[i][0],z);
        }
    }
}
int dfs(int x,int y){
    int i,ans=1;
    for(i=0;i<4;i++){
        if((s[x][y] & (1<<i))==0 && v[x+d[i][1]][y+d[i][0]]==0){
            v[x+d[i][1]][y+d[i][0]]=1;
            ans+=dfs(x+d[i][1],y+d[i][0]);
        }
    }
    return ans;
}
int main(){
    freopen("castle.in","r",stdin);
    freopen("castle.out","w",stdout);
    int n,m,i,j,k;
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++)
        for(j=1;j<=n;j++)
            scanf("%d",&s[i][j]);
    for(i=1;i<=m;i++)
        for(j=1;j<=n;j++){
            if(v[i][j]==0){
                v[i][j]=1;
                k=dfs(i,j);
                if(k>area) area=k;
                ct(i,j,k),dfs(i,j),room++;
            }
        }
    for(j=1;j<=n;j++){
        for(i=m;i>=1;i--){
            if((s[i][j] & 2) && r[i][j]+r[i-1][j]>add && t[i][j]!=t[i-1][j]){
                add=r[i][j]+r[i-1][j];
                X=j,Y=i,C='N';
            }
            if((s[i][j] & 4) && r[i][j]+r[i][j+1]>add && t[i][j]!=t[i][j+1]){
                add=r[i][j]+r[i][j+1];
                X=j,Y=i,C='E';
            }
        }
    }
    printf("%d\n%d\n%d\n%d %d %c\n",room,area,add,Y,X,C);
}

沒有留言:

張貼留言