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 < ...
随机推荐
- android-5.1编译配置(van)
必备文件: archives1211.tgz ubuntu_install_1204.tgz 安装指引: ubuntu_install_1204/readme.txt 工作目录结构: git ├── ...
- JS学习笔记 - fgm练习 - 限制输入框的字符类型 正则 和 || 或运算符的运用 i++和++i
<script> window.onload = function(){ var aInp = document.getElementsByTagName('input'); var oS ...
- [D3] Reuse Transitions in D3 v4
D3 transitions start executing as soon as they’re created, and they’re destroyed once they end. This ...
- 硬件——STM32 , 录音,wav
详细的wav头文件解析,有例子:http://www.cnblogs.com/chulin/p/8918957.html 关于录音程序的编写: 我的思路是改写原子的程序,原子的程序需要借助VS1053 ...
- macos中xcode使用opencv,错误总结
使用opencv时,进行编译时,会出现如上图所示错误,按图示更改就行了(我编译出来的有2处)主要参考 https://blog.csdn.net/fk1174/article/details/7011 ...
- C#游戏开发高速入门 2.1 构建游戏场景
C#游戏开发高速入门 2.1 构建游戏场景 假设已经计划好了要编写什么样的游戏,在打开Unity以后.要做的第一件事情就是构建游戏场景(Scene).游戏场景就是玩家游戏时,在游戏视图中看到的一切. ...
- 设计模式--单例模式之Lock
1.为什么用Lock及关键知识 当我们使用线程的时候,效率最高的方式当然是异步,即个个线程同时运行,其间互不依赖和等待.当不同的线程都需要访问某个资源的时候,就需要同步机制了,也就是说当对同一个资源进 ...
- Cocos2d-X开发中国象棋《八》走棋
在上一节中实现了新局,至此中国象棋的准备工作差点儿相同都完毕了,在接下来的博客中将介绍玩家的走棋和一些游戏属性的设置,今天先介绍走棋和走棋规则 老规则,先看走棋的效果图,然后依据效果图一步一步分析游戏 ...
- sqoop 1.4.4-cdh5.1.2快速入门 分类: C_OHTERS 2015-06-06 11:40 208人阅读 评论(0) 收藏
一.快速入门 (一)下载安装 1.下载并解压 wget http://archive.cloudera.com/cdh5/cdh/5/sqoop-1.4.4-cdh5.1.2.tar.gz tar - ...
- SQL日期时间函数
一.Sql Server中的日期与时间函数 1. 当前系统日期.时间 select getdate() 2. dateadd 在向指定日期加上一段时间的基础上,返回新的 datetime 值 例如 ...