思路:这个题目难在建图,開始的时候我想把每一个房间没有墙的面求出来,然后再和他邻近的房间加上一条边进行建图,后面发现要通过题目给定的条件求出房间那个面没有墙是十分困难的;后面參考了别人的思路,我们记录每一个房间那几面是有墙的(这个非常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. JSON.parse和eval()的区别

    eval方法不检查给的字符串是否符合json的格式,parse会检查json语法格式. 比如一个json字符串data: { "a": 1, "b": &quo ...

  2. 关于使用toFixed()函数时报错"toFixed() is not a function"的问题

    toFixed()函数只有数字类型的参数才可使用,字符串类型的参数需用parseFloat或者parseInt转换后再使用

  3. Bitmap-把方形图片处理为圆形

    这个是直接在网上转载的,自己验证可靠 转载自http://my.oschina.net/zhouz/blog/213164 直接贴上代码 import android.graphics.Bitmap; ...

  4. 【Expression 序列化】WCF的简单使用及其Expression Lambada的序列化问题初步解决方案

    地址:http://www.cnblogs.com/guomingfeng/tag/Expression%E5%BA%8F%E5%88%97%E5%8C%96/

  5. amaze样例页面分析(一)

    amaze样例页面分析(一) 一.总结 1.从审查(inspect)中是很清楚的可以弄清楚这些part之间的结构关系的 2.一者在于弄清楚他们之间的结构关系,二者在于知道结构的每一部分是干嘛的 3.i ...

  6. 2.Spring Boot 入门

    转自:https://blog.csdn.net/catoop/article/details/50501664

  7. php编译参数注释

    1. 指定安装路径 --prefix=PREFIX 2. 指定运行用户 --with-fpm-user=nginx 3. 指定运行组 --with-fpm-group=nginx 3.与'--pref ...

  8. ORA-16009 remote archive log destination must be a STANDBY database

    ORA-16009错误处理 问题描述: 主备在做Switchover切换时,在切换后的备库报如下错误: Wed Jul 22 04:49:02 2015 Errors in file /u01/app ...

  9. JIRA6.3.6 安装汉化破解指南

    JIRA6.3.6 安装汉化破解指南 近期试着安装了下JIRA,碰到了些问题.特记录下来,供后来者使用: 1.常规安装 1.1. 下载并安装jira 从官网下载atlassian-jira-6.3.6 ...

  10. Javascript和jquery事件--鼠标右键事件,contextmenu

    右键点击触发是浏览器的默认菜单事件contextmenu,你可以选择阻止它,使用event.preventDefault();或者return false;. 想要定义右键点击事件,关注的是mouse ...