[【USACO】The Castle(dfs+枚举)

来源:互联网 发布:手机淘宝店铺免费模板 编辑:程序博客网 时间:2024/06/16 09:44

思路很好像,卡了我很久的就是当最大房间一样的时候判断输出哪个的条件, = = 简直无情

/*ID: 18906421LANG: C++PROG: castle*/#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 55;int mat[maxn][maxn][2] = {0}; // 0 1  下  右int n,m,vis[maxn][maxn];int max1 = 0,max2 = 0,cnt = 0;void debug(){    for(int i = 0; i < n; i++){        for(int j = 0; j < m; j++)            printf("[%d,%d],(%d %d)",i,j,mat[i][j][0],mat[i][j][1]);        puts("");    }}void change(int x,int  y,int v){    if(v == 8 || v == 9 || v == 10 || v == 12 || v == 11 || v == 13 || v == 14 || v == 15)        mat[x][y][0] = 1;    if(v == 4 || v == 5 || v == 6  || v == 12 || v == 7  || v == 14 || v == 13 || v == 15)        mat[x][y][1] = 1;}int dfs(int x,int y){    vis[x][y] = 1;    int ans = 1;    if(!mat[x][y][0] && x + 1 <  n && !vis[x + 1][y]) ans += dfs(x + 1,y);      // 下    if(!mat[x][y][1] && y + 1 <  m && !vis[x][y + 1]) ans += dfs(x,y + 1);      // 右    if(x - 1 >= 0 && !mat[x - 1][y][0] && !vis[x - 1][y]) ans += dfs(x - 1,y);  // 上    if(y - 1 >= 0 && !mat[x][y - 1][1] && !vis[x][y - 1]) ans += dfs(x,y - 1);  // 左    return ans;}void solve(int &max_size,int &cc){    memset(vis,0,sizeof(vis));    for(int i = 0; i < n; i++)        for(int j = 0; j < m; j++)            if(!vis[i][j]){                max_size = max(max_size,dfs(i,j));                cc ++;            }}int main(){    freopen("castle.in","r",stdin);    freopen("castle.out","w",stdout);    scanf("%d%d",&m,&n);    for(int i = 0; i < n; i++)        for(int j = 0; j < m; j++){            int x;            scanf("%d",&x);            change(i,j,x);        }    //debug();    solve(max1,cnt); //获得最大房间    printf("%d\n%d\n",cnt,max1);    int dirr,pos_x,pos_y,max_size = max1,cc;    for(int j = m - 1; j >= 0; j--)        for(int i = 0; i < n; i++){            for(int k = 1; k >= 0; k --)                if(mat[i][j][k]){       //k 为 0 破坏下面 1 破坏右边                    max2 = 0;cc = 0;                    mat[i][j][k] = 0;                    solve(max2,cc);                    mat[i][j][k] = 1;                    int xx = k == 0 ? i + 1 : i;                    int yy = j;                    if(max2 > max_size){                        pos_x = xx; pos_y = yy;                        max_size = max2;                        dirr = k;                    }                    else if(max2 == max_size){                        if(yy < pos_y || (yy == pos_y && xx > pos_x)){                            pos_x = xx; pos_y = yy;                            max_size = max2;                            dirr = k;                        }                    }                }        }    if(dirr == 1)        printf("%d\n%d %d %c\n",max_size,pos_x + 1,pos_y + 1,'E');    else        printf("%d\n%d %d %c\n",max_size,pos_x + 1,pos_y + 1,'N');    return 0;}

0 0
原创粉丝点击