USACO-Section2.1 The Castle

来源:互联网 发布:经济数据查询 编辑:程序博客网 时间:2024/06/11 01:58

2017-8-3

题目描述

知道城堡有多少个房间,每个房间有多大把一面单独的墙(指两个单位间的墙)拆掉以形成一个更大的房间

解答

代码写的好长...

代码

/*ID: 18795871PROG: castleLANG: C++*/#include<iostream>#include<cstring>#include<fstream>using namespace std;const int N = 50;ifstream fin("castle.in");ofstream fout("castle.out");struct{    bool d,x,n,b;    int x1,x2,y1,y2,a;}s[N+2][N+2];int r,c;int m,cnt,sum;bool f[N+1][N+1];void init(){ //根据所给条件判断哪里有墙     int t;    fin>>c>>r;    for (int i=1;i<=r;i++){        for (int j=1;j<=c;j++){            fin>>t;            switch(t){ //零的时候全为默认值                 case(1):                  s[i][j].x=true;                  break;                case(2):                  s[i][j].b=true;                  break;                case(4):                  s[i][j].d=true;                  break;                case(8):                  s[i][j].n=true;                  break;                case(3):                  s[i][j].x=true;                  s[i][j].b=true;                  break;                case(5):                  s[i][j].x=true;                  s[i][j].d=true;                  break;                case(6):                  s[i][j].b=true;                  s[i][j].d=true;                  break;                case(9):                  s[i][j].x=true;                  s[i][j].n=true;                  break;                case(10):                  s[i][j].b=true;                  s[i][j].n=true;                  break;                case(12):                  s[i][j].d=true;                  s[i][j].n=true;                  break;                case(7):                  s[i][j].x=true;                  s[i][j].b=true;                  s[i][j].d=true;                  break;                case(11):                  s[i][j].x=true;                  s[i][j].b=true;                  s[i][j].n=true;                  break;                case(13):                  s[i][j].x=true;                  s[i][j].d=true;                  s[i][j].n=true;                  break;                case(14):                  s[i][j].b=true;                  s[i][j].d=true;                  s[i][j].n=true;                  break;                case(15):                  s[i][j].b=true;                  s[i][j].d=true;                  s[i][j].x=true;                  s[i][j].n=true;            }        }    }}bool con(int i,int j){ //是否越界     if (i>r||j>c||i<1||j<1) return false;    return true;}void dfs(int i,int j){ //深搜求出连通的房间数以及每个房间相应格数     if (!s[i][j].b&&con(i-1,j)&&!f[i-1][j]){        f[i-1][j]=true;        cnt++;        dfs(i-1,j);    }    if (!s[i][j].n&&con(i+1,j)&&!f[i+1][j]){        f[i+1][j]=true;        cnt++;        dfs(i+1,j);    }    if (!s[i][j].d&&con(i,j+1)&&!f[i][j+1]){        f[i][j+1]=true;        cnt++;        dfs(i,j+1);    }    if (!s[i][j].x&&con(i,j-1)&&!f[i][j-1]){        f[i][j-1]=true;        cnt++;        dfs(i,j-1);    }}void cal(){ //a用来确定是否在同一房间内     for (int i=1;i<=r;i++){        for (int j=1;j<=c;j++){            if (f[i][j]){        if (!s[i][j].x1&&!s[i][j].x2&&!s[i][j].y1&&!s[i][j].y2){                   s[i][j].a=sum;                }                if (s[i][j].d&&!s[i][j].x1){                    s[i][j].x1=cnt; //东面对应房间的格子数                }                if (s[i][j].x&&!s[i][j].x2){                    s[i][j].x2=cnt; //西面对应房间的格子数                }                if (s[i][j].n&&!s[i][j].y2){                    s[i][j].y2=cnt; //南面对应房间的格子数                }                if (s[i][j].b&&!s[i][j].y1){                    s[i][j].y1=cnt; //北面对应房间的格子数                }            }        }    }}void res(){ //求出结果     int p,q,m=0;    char ch;    for (int j=1;j<=c;j++){        for (int i=r;i>0;i--){            if (s[i][j].b){        if (s[i][j].a!=s[i-1][j].a&&s[i][j].y1+s[i-1][j].y2>m){                    m=s[i][j].y1+s[i-1][j].y2;                    p=i;q=j;ch='N';                }            }            if (s[i][j].d){        if (s[i][j].a!=s[i][j+1].a&&s[i][j].x1+s[i][j+1].x2>m){                    m=s[i][j].x1+s[i][j+1].x2;                    p=i;q=j;ch='E';                }            }        }    }    fout<<m<<endl<<p<<" "<<q<<" "<<ch<<endl;}int main(){    init();    m=0;sum=0;    memset(f,false,sizeof(f));    for (int i=1;i<=r;i++){        for (int j=1;j<=c;j++){            if (!f[i][j]){                f[i][j]=true;                cnt=1;                dfs(i,j);                m=max(m,cnt);                sum++;                cal();             }        }    }    fout<<sum<<endl;    fout<<m<<endl;    res();    return 0;}
原创粉丝点击