usaco castle

来源:互联网 发布:数据公司 30亿 收购 编辑:程序博客网 时间:2024/06/01 08:08
/*ID: ljracm1LANG: C++PROB: castle*/#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>#define Tusing namespace std;int M,N;int maze[55][55];int wall[55][55];int vis[55][55];int area[255];int color=1,sum=0;void dfs(int x,int y){    sum++;    vis[x][y]=color;    int xx,yy;    int d = wall[x][y];    if(!(d==4||d==5||d==6||d==7||d==12||d==13||d==14||d==15)){        yy = y+1;        if(yy>=1&&yy<=M&&!vis[x][yy])dfs(x,yy);    }    if(!(d==8||d==9||d==10||d==11||d==12||d==13||d==14||d==15)){        xx = x+1;        if(xx>=1&&xx<=N&&!vis[xx][y])dfs(xx,y);    }    if(!(d==1||d==3||d==5||d==7||d==9||d==11||d==13||d==15)){        yy = y-1;        if(yy>=1&&yy<=N&&!vis[x][yy])dfs(x,yy);    }    if(!(d==2||d==3||d==6||d==7||d==10||d==11||d==14||d==15)){        xx = x-1;        if(xx>=1&&xx<=N&&!vis[xx][y])dfs(xx,y);    }}int main(){    #ifdef T        freopen("castle.in","r",stdin);        freopen("castle.out","w",stdout);    #endif    int mx1=0,mx2=0;    while(cin>>M>>N){        mx1=0;        for(int i=1; i<=N; i++)            for(int j=1; j<=M; j++)                cin>>wall[i][j];        memset(vis,0,sizeof(vis));        for(int i=1; i<=N; i++)            for(int j=1; j<=M; j++)               if(!vis[i][j]){                   sum=0;                   dfs(i,j);                   area[color++]=sum;                   mx1 = max(mx1,sum);               }        mx2 = mx1;        int a,b;        char dir;        for(int j=1; j<=M; j++){            for(int i=N; i>=1; i--){                int d = wall[i][j];                int xx,yy,x=i,y=j;                if(d==2||d==3||d==6||d==7||d==10||d==11||d==14||d==15){                    xx = x-1;                    if(xx>=1&&xx<=N&&vis[xx][y]!=vis[x][y]&&area[vis[xx][y]]+area[vis[x][y]]>mx2){                         mx2 = area[vis[xx][y]]+area[vis[x][y]];                         a = x; b = y; dir = 'N';                    }                }                if(d==4||d==5||d==6||d==7||d==12||d==13||d==14||d==15){                    yy = y+1;                    if(yy>=1&&yy<=M&&vis[x][yy]!=vis[x][y]&&area[vis[x][yy]]+area[vis[x][y]]>mx2){                         mx2 = area[vis[x][yy]]+area[vis[x][y]];                         a = x;  b = y; dir = 'E';                    }                }            }        }        cout<<color-1<<endl;        cout<<mx1<<endl;        cout<<mx2<<endl;        cout<<a<<" "<<b<<" "<<dir<<endl;    }    return 0;}

0 0
原创粉丝点击