USACO--2.1The Castle
思路:这个题目难在建图,開始的时候我想把每一个房间没有墙的面求出来,然后再和他邻近的房间加上一条边进行建图,后面发现要通过题目给定的条件求出房间那个面没有墙是十分困难的;后面參考了别人的思路,我们记录每一个房间那几面是有墙的(这个非常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的更多相关文章
- USACO Section2.1 The Castle 解题报告
castle解题报告 —— icedream61 博客园(转载请注明出处)--------------------------------------------------------------- ...
- 【USACO 2.1】The Castle
/* TASK: castle LANG: C++ SOLVE: 深搜,注意每个方向对应值.枚举去掉的墙,然后再dfs,注意墙要复原,并且dfs里要判断是否超出边界. */ #include<c ...
- USACO The Castle
首先看一下题目. The CastleIOI'94 - Day 1 In a stroke of luck almost beyond imagination, Farmer John was sen ...
- USACO Section 2.1 The Castle
/* ID: lucien23 PROG: castle LANG: C++ */ /********************************************************* ...
- USACO Section 2.1 The Castle 解题报告
题目 题目描述 有一个城堡,城堡中有若干个房间,房间与房间之间用墙来进行分隔.现在我们需要统计这个城堡有多少个房间,并且还要找出最大的房间的面积是多少(一个单元格就代表一个单元面积).城堡的主人现在想 ...
- USACO 2.1 The Castle
题目大意:给你一个城堡让你求有多少房间,最大房间有多大,敲掉一堵墙后最大的房间有多大,敲掉那座墙 思路:比较恶心的bfs题,反正就是bfs使劲敲 /*{ ID:a4298442 PROB:castle ...
- USACO castle
<pre name="code" class="cpp"><pre>USER: Kevin Samuel [kevin_s1] TASK ...
- [USACO Section 2.1]城堡 The Castle (搜索)
题目链接 Solution 比较恶心的搜索,思路很简单,直接广搜找联通块即可. 但是细节很多,要注意的地方很多.所以直接看代码吧... Code #include<bits/stdc++.h&g ...
- Usaco Training [2.1] The Castle 搜索
传送门 题目的输出的4个信息 前两个很容易,dfs,bfs都可以,图怎么建都可以 后两个在搜索的时候记录belong[i][j]和已有的size即可 代码应该比不少题解清晰吧 #include < ...
随机推荐
- Django路由分配以及模版渲染
路由上: 在网络上区分不同的电脑通过IP.端口和网卡的MAC地址等,在web框架中怎么区分不同的请求呢,就是通过 ‘url(路由)’ ,url 学名叫做全球统一资源定位符,其实就是一个网址 一个url ...
- SpringMVC,Mybatis,FreeMarker连接mycat示例(一)
首页 > 程序开发 > 软件开发 > Java > 正文 SpringMVC,Mybatis,FreeMarker连接mycat示例(一) 项目结构如图: 首先是各种配置文件, ...
- 基于Redis bitmap实现开关配置功能
作者:zhanhailiang 日期:2014-12-21 bitmap api SETBIT key offset value 对key所储存的字符串值,设置或清除指定偏移量上的位(bit). 位的 ...
- C++源文件到可运行文件的过程
一.四个步骤 对于C/C++编写的程序,从源码到可运行文件,一般经过以下四个步骤: 1).预处理,产生.ii文件 2).编译,产生汇编文件(.s文件) 3).汇编,产生目标文件(.o或.obj文 ...
- 1.1 Introduction中 Kafka for Stream Processing官网剖析(博主推荐)
不多说,直接上干货! 一切来源于官网 http://kafka.apache.org/documentation/ Kafka for Stream Processing kafka的流处理 It i ...
- 【CS Round #43 E】Coprime Pairs
[链接]点击打开链接 [题意] 让你选择n个数字,组成一个数组,使得这n个数字中恰好有k对,它们是互质的. [题解] 我们可以先找出前n个质数,那么接下来的问题就转化为,凑出rest = n*(n-1 ...
- [Angular & Web] Retrieve user data from Session
Once user sign up, we store the user data inside cookie in the broswer and also keep a memory copy i ...
- (转)Windows Server 2012 R2虚拟机自激活(AVMA)技术
转自: 老丁的技术博客 相信Hyper-v管理员都有这样的经历,安装多台虚拟机后,都要一台一台手工激活,如果虚拟机足够多的话,这是一项很繁琐的工作,但从Windows Server 2012 R2开始 ...
- linux 内核源代码目录结构
/arch:目录包括了所有和体系结构相关的核心代码.它下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是Intel CPU及与之相兼容体系结构的子目录.PC机一般都基于此目录. / ...
- fatfs的设置
官方网址:file:///E:/%E5%8D%95%E7%89%87%E6%9C%BA/FATFS/ff13a/documents/doc/config.html 关于多个文件同时打开的配置::在ff ...