思路:这个题目难在建图,開始的时候我想把每一个房间没有墙的面求出来,然后再和他邻近的房间加上一条边进行建图,后面发现要通过题目给定的条件求出房间那个面没有墙是十分困难的;后面參考了别人的思路,我们记录每一个房间那几面是有墙的(这个非常easy做到),然后就不显示建图了。直接通过dfs标记的思想求出这个图全部的连通块(Flood fill 算法)。后面的处理就比較简单了,求出这个连通块后就能够知道总共同拥有几个房间了,最大的房间有多大;然后我们再依次试探拆除每一个房间的N,E面的墙壁。看一下能得到的最大房间的数量。

对于题目中:

Choose the optimal wall to remove from the set of optimal walls by choosing the module farthest to the west (and then, if still tied, farthest to the south). If still tied, choose ‘N’ before ‘E’. Name that wall by naming the module that borders it on either the west or south, along with a direction of N or E giving the location of the wall with respect to the module.

这段话,開始的时候我非常是不能理解,后面才知道,他的意思是:在大的方向上我们要优先拆除西面和然后是南面。对于每一个小的房间我们应该优先拆除北面然后是东面。果然是英语太渣。。。

。。。

代码例如以下:

/*
ID: 15674811
LANG: C++
TASK: castle
*/ #include<iostream>
#include<cstdio>
#include<cstring>
#include<fstream>
using namespace std; ///南东北西
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1}; ///西南北东
///int dx1[]={0,1,-1,0};
///int dy1[]={-1,0,0,1};
///北东
int dx1[]={-1,0};
int dy1[]={0,1}; int vis[55][55],n,m;
char name[]={'N','E'}; typedef struct
{
bool flag[5];
}P;
P p[55][55]; void dfs(int x,int y,int flag)
{
for(int k=0;k<4;k++)
{
if(p[x][y].flag[k])
continue;
int xx=x+dx[k];
int yy=y+dy[k];
if(xx<1||xx>n||yy<1||yy>m)
continue;
if(vis[xx][yy])
continue;
vis[xx][yy]=flag;
dfs(xx,yy,flag);
}
} int main()
{
ofstream fout("castle.out");
ifstream fin("castle.in");
//ifstream fin("lkl.txt");
while(fin>>m>>n)
{
memset(p,0,sizeof(p));
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
int x;
fin>>x;
if(x>=8) p[i][j].flag[0]=true,x-=8;
if(x>=4) p[i][j].flag[1]=true,x-=4;
if(x>=2) p[i][j].flag[2]=true,x-=2;
if(x>=1) p[i][j].flag[3]=true;
}
int cnt=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(vis[i][j])
continue;
vis[i][j]=++cnt;
dfs(i,j,cnt);
}
int num[3000];
memset(num,0,sizeof(num));
int Max=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
num[vis[i][j]]++;
Max=max(Max,num[vis[i][j]]);
}
fout<<cnt<<endl<<Max<<endl;
int room=0,rx,ry,k;
for(int x=1;x<=n;x++)
for(int y=1;y<=m;y++)
{
for(int d=0;d<2;d++)
{
int xx=x+dx1[d];
int yy=y+dy1[d];
if(xx<1||xx>n||yy<1||yy>m)
continue;
if(vis[x][y]==vis[xx][yy])
continue;
int tmp=num[vis[x][y]]+num[vis[xx][yy]];
if(room<tmp)
{
rx=x; ry=y;
room=tmp;
k=d;
}
else if(room==tmp)
{
if(y<=ry)
{
if(rx==x&&ry==y) ///同一个格子北东都能够要保证北优先
continue;
rx=x; ry=y;
k=d;
}
}
}
}
fout<<room<<endl;
fout<<rx<<" "<<ry<<" "<<name[k]<<endl;
}
return 0;
}

USACO--2.1The Castle的更多相关文章

  1. USACO Section2.1 The Castle 解题报告

    castle解题报告 —— icedream61 博客园(转载请注明出处)--------------------------------------------------------------- ...

  2. 【USACO 2.1】The Castle

    /* TASK: castle LANG: C++ SOLVE: 深搜,注意每个方向对应值.枚举去掉的墙,然后再dfs,注意墙要复原,并且dfs里要判断是否超出边界. */ #include<c ...

  3. USACO The Castle

    首先看一下题目. The CastleIOI'94 - Day 1 In a stroke of luck almost beyond imagination, Farmer John was sen ...

  4. USACO Section 2.1 The Castle

    /* ID: lucien23 PROG: castle LANG: C++ */ /********************************************************* ...

  5. USACO Section 2.1 The Castle 解题报告

    题目 题目描述 有一个城堡,城堡中有若干个房间,房间与房间之间用墙来进行分隔.现在我们需要统计这个城堡有多少个房间,并且还要找出最大的房间的面积是多少(一个单元格就代表一个单元面积).城堡的主人现在想 ...

  6. USACO 2.1 The Castle

    题目大意:给你一个城堡让你求有多少房间,最大房间有多大,敲掉一堵墙后最大的房间有多大,敲掉那座墙 思路:比较恶心的bfs题,反正就是bfs使劲敲 /*{ ID:a4298442 PROB:castle ...

  7. USACO castle

    <pre name="code" class="cpp"><pre>USER: Kevin Samuel [kevin_s1] TASK ...

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

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

  9. Usaco Training [2.1] The Castle 搜索

    传送门 题目的输出的4个信息 前两个很容易,dfs,bfs都可以,图怎么建都可以 后两个在搜索的时候记录belong[i][j]和已有的size即可 代码应该比不少题解清晰吧 #include < ...

随机推荐

  1. 通过no-gui模式运行jmeter脚本与生成报告

    说明:使用NO-GUI 模式,即命令行模式运行 JMeter 测试脚本能够大大缩减所需要的系统资源. 步骤:在GUI(图形化界面)模式调整好脚本,通过FTP工具将需要测试的.jmx文件传输到linux ...

  2. 【Good Bye 2017 C】 New Year and Curling

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举前i-1个圆. 哪些圆和它相交. 取圆心纵坐标最大的那个圆就可以了. [代码] #include <bits/stdc++ ...

  3. layout-maxWidth属性用法

    对于maxWidth属性,相信大家都不陌生.不过,今天我遇到了一个问题,就是当我希望一个relayout的宽度有个最大值的时候,用maxWidth却没办法实现.这里总结下maxWidth 的用法 1. ...

  4. app 自动化测试 Appium+python可以运行的代码

    Appium

  5. 洛谷——P1598 垂直柱状图

    https://www.luogu.org/problem/show?pid=1598 题目描述 写一个程序从输入文件中去读取四行大写字母(全都是大写的,每行不超过72个字符),然后用柱状图输出每个字 ...

  6. android开发设计辅助工具整理

    1.Button设计工具button设计

  7. (转)DOS批处理的字符串功能

    批处理有着具有非常强大的字符串处理能力,其功能绝不低于C语言里面的字符串函数集.批处理中可实现的字符串处理功能有:截取字符串内容.替换字符串特定字段.合并字符串.扩充字符串等功能.下面对这些功能一一进 ...

  8. 小程序踩坑记- tabBar.list[3].selectedIconPath 大小超过 40kb

    重新启动微信小程序编辑器的时候遇到了这样的一个问题: tabBar.list[3].selectedIconPath 大小超过 40kb 微信小程序开发的过程之中总会出现这样或者那样的错误,需要我们耐 ...

  9. cordova android

    Image.png Image.png http://www.jscss.cc/2016/10/18/cordova.html 装一个全局的cordova: 官网介绍:http://cordova.a ...

  10. macos中xcode使用opencv,错误总结

    使用opencv时,进行编译时,会出现如上图所示错误,按图示更改就行了(我编译出来的有2处)主要参考 https://blog.csdn.net/fk1174/article/details/7011 ...