轻度中毒

原题 :The Castle
以下为题解部分:明明辣么简单的一道题,硬是搞了1.5h,WTF?以下列出本题的一些要点。

  • 搜索(DFS)嘛,染色嘛,统计大小嘛,很容易想,也很更易处理。
  • 接下来就只需要枚举墙,得出最大值了。好像很简单的样子QAQ——but №!我™就是在这里折腾了一个小时(可能是我太菜了)。
  • 蒟蒻统计的思路是:北墙(-1,0)与东墙(0,+1)分开枚举,得到各自的最优解,然后再比较这两个解,输出更好的那个(捂脸)。
  • 详细见丑*代码:

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    main() {}
    const int fx[]= {0,-1,0,1};//W,N,E,S
    const int fy[]= {-1,0,1,0};
    int n,m,id[51][51],a[51][51],tot,room[50*50+1];
    void clor(int x,int y,int c) {
    id[x][y]=c;
    room[c]++;//面积
    for(int i=0,nx,ny; i<4; i++)
        if(!(a[x][y]&(1<<i)))  {//美丽的二进制解析
            nx=x+fx[i],ny=y+fy[i];
            if(nx>0&&ny>0&&nx<=n&&ny<=m&&!id[nx][ny])
                clor(nx,ny,c);
        }
    }
    int entry() {
    scanf("%d%d",&m,&n);
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=m; j++)
            scanf("%d",&a[i][j]);
    }
    for(int i=1; i<=n; i++) {//染色
        for(int j=1; j<=m; j++)
            if(!id[i][j])
                clor(i,j,++tot);
    }
    int maxn=*std::max_element(room+1,room+tot+1);
    printf("%d\n""%d\n",tot,maxn);
    int ans1=maxn,ans2=maxn;
    int x1=n,y1=0,x2=n,y2=0;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++) {
            if((a[i][j]&2)&&id[i][j]!=id[i-1][j]&&ans1<=room[id[i][j]]+room[id[i-1][j]]) {
                if(ans1!=room[id[i][j]]+room[id[i-1][j]]) x1=i,y1=j;
                else if(j<y1) y1=j,x1=i;//West
                else if(j==y1 && i>x1) x1=i;//South
                ans1=room[id[i][j]]+room[id[i-1][j]];
            }//北墙
            if((a[i][j]&4)&&id[i][j]!=id[i][j+1]&&ans2<=room[id[i][j]]+room[id[i][j+1]]) {
                if(ans2!=room[id[i][j]]+room[id[i][j+1]]) x2=i,y2=j;
                else if(j<y2) y2=j,x2=i;//West
                else if(j==y2 && i>x2) x2=i;//South
                ans2=room[id[i][j]]+room[id[i][j+1]];
            }//东墙
        }
    if(ans1>ans2) printf("%d\n%d %d N\n",ans1,x1,y1);
    else if(ans1<ans2) printf("%d\n%d %d E\n",ans2,x2,y2);//maxmize result
    else if(y1<y2) printf("%d\n%d %d N\n",ans1,x1,y1);
    else if(y1>y2) printf("%d\n%d %d E\n",ans2,x2,y2);//west
    else if(x1>x2) printf("%d\n%d %d N\n",ans1,x1,y1);
    else if(x1<x2) printf("%d\n%d %d E\n",ans2,x2,y2);//south
    else printf("%d\n%d %d N\n",ans1,x1,y1);
    }
    int aptal=entry();

P1457 城堡 The Castle的更多相关文章

  1. 洛谷P1457 城堡 The Castle

    P1457 城堡 The Castle 137通过 279提交 题目提供者该用户不存在 标签USACO 难度提高+/省选- 提交  讨论  题解 最新讨论 暂时没有讨论 题目描述 我们憨厚的USACO ...

  2. 洛谷 P1457 城堡 The Castle 解题报告

    P1457 城堡 The Castle 题目描述 我们憨厚的USACO主人公农夫约翰(Farmer John)以无法想象的运气,在他生日那天收到了一份特别的礼物:一张"幸运爱尔兰" ...

  3. 洛谷 P1457 城堡 The Castle

    P1457 城堡 The Castle 题目描述 我们憨厚的USACO主人公农夫约翰(Farmer John)以无法想象的运气,在他生日那天收到了一份特别的礼物:一张“幸运爱尔兰”(一种彩票).结果这 ...

  4. 洛谷—— P1457 城堡 The Castle

    https://www.luogu.org/problem/show?pid=1457 题目描述 我们憨厚的USACO主人公农夫约翰(Farmer John)以无法想象的运气,在他生日那天收到了一份特 ...

  5. P1457 城堡 The Castle 位运算+BFS+思维(难题,好题)

    题目描述 我们憨厚的USACO主人公农夫约翰(Farmer John)以无法想象的运气,在他生日那天收到了一份特别的礼物:一张"幸运爱尔兰"(一种彩票).结果这张彩票让他获得了这次 ...

  6. 题解 洛谷P1457 【城堡 The Castle】

    这道题,看似很烦,无从下手,但其实只要用位运算和联通快就能水过了呀. 首先,输入:似乎大意是把一个数拆成二进数的相加,分别表示\((i,j)\)东南西北是否有墙.\(1\)表示西,\(2\)表示北,\ ...

  7. 题解 P1457 【城堡 The Castle】

    来讨论区大摇大摆地逛了一圈后,我发现竟然大家的代码 都很长 然而代码真的要写那么长吗 首先,来分析问题,1,2,4,8,这些数显然是有特点的,也许你已经想到了没错,它们都是2的次方数. 1是2的0次方 ...

  8. [USACO Section 2.1]城堡 The Castle (搜索)

    题目链接 Solution 比较恶心的搜索,思路很简单,直接广搜找联通块即可. 但是细节很多,要注意的地方很多.所以直接看代码吧... Code #include<bits/stdc++.h&g ...

  9. Luogu USACO Training 刷水记录

    开个坑记录一下刷USACO的Training的记录 可能会随时弃坑 只有代码和做法简述 可能没有做法简述 [USACO1.1]你的飞碟在这儿Your Ride Is He… 模拟,细节已忘 #incl ...

随机推荐

  1. Django Form表单学习总结

    Form中添加自定义的验证:    1.对特定字段属性的验证;    2.包含多字段的验证. 先创建一个简单的Form: from django import forms class ContactF ...

  2. Android 屏幕相关概念(1)

    1.  术语和概念 术语 说明 备注  Screen size(屏幕尺寸)  指的是手机实际的物理尺寸,比如常用的2.8英寸,3.2英寸,3.5英寸,3.7英寸  摩托罗拉milestone手机是3. ...

  3. PHP之回调函数传参(解决eval函数拼接对象参数的问题)

    在使用Smarty时,定义了一个统一调用控制器的函数,如下: function C($name, $method){//控制器的名称和其中方法的名称 require_once "contro ...

  4. 假如时光倒流,我会这么学习Java

    回头看看, 我进入Java 领域已经快15个年头了, 虽然学的也一般, 但是分享下我的心得,估计也能帮大家少走点弯路. [入门] 我在2001年之前是C/C++阵营, 有C和面向对象的基础, 后来转到 ...

  5. zookeeper 笔记-Curator选举方案

    Curator提供了两种选举方案:Leader Latch和Leader Election Leader Latch 随机从候选着中选出一台作为leader,选中之后除非调用close()释放lead ...

  6. 超文本传送协议HTTP

    1. HTTP的操作过程: HTTP是面向事务的应用层协议.HTTP协议本身是无连接的,为了保证数据的可靠传输,HTTP使用了面向连接的TCP作为运输层协议.所以,在发送HTTP报文之前都需要先建立T ...

  7. bug:记最近出现的非功能bug

    1.android 4.1.2 的兼容bug 一直以为Android 测试 4 5 6就可以了,结果发现Android4.1.2 和Android4.3之间还是有差距的. 处理办法:验证版本兼容的时候 ...

  8. 如何用Android Studio同时使用SVN和Git管理项目

    这篇来讲讲如何在 Android Studio 上同时用 SVN 和 Git 来管理项目.我知道,你肯定会说我吃饱了撑着,没事找事做,为啥要同时用 SVN 和 Git 来管理项目.问题是,我也不想啊, ...

  9. stl中auto_ptr,unique_ptr,shared_ptr,weak_ptr四种智能指针使用总结

    stl中auto_ptr,unique_ptr,shared_ptr,weak_ptr四种智能指针使用总结 1. auto_ptrauto_ptr主要是用来解决资源自动释放的问题,比如如下代码:voi ...

  10. tarjan求强连通分量+缩点+割点以及一些证明

    “tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄>   自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...