USACO Section2.1 The Castle 解题报告
castle解题报告 —— icedream61 博客园(转载请注明出处)
------------------------------------------------------------------------------------------------------------------------------------------------
【题目】
有N×M的矩阵,边框都是实际存在的“墙”。如下图:
1 2 3 4 5 6 7
#############################
1 # | # | # | | #
#####---#####---#---#####---#
2 # # | # # # # #
#---#####---#####---#####---#
3 # | | # # # # #
#---#########---#####---#---#
4 # -># | | | | # #
#############################
上图就是N=4,M=7的一种情况,#表示墙,|表示没有墙。
没有墙的连通块,就被认为是一个房间。例如图中,(2,6)是一个面积为1的房间,(1,3)(1,4)(2,4)则是一个面积为3的房间。
现在请你打破一面墙,从而连通两个房间得到一个更大的房间。请你求出破出房间面积最大的情况,并给出下列输出。(例如图中就是打破箭头所指的墙)
【输入格式】
第一行两个数,M和N。
下面N行,每行M个数,依次是每个点四周墙的情况,各由一个数代表。这个数由四个数中的几个相加而成:
1: 左面有墙
2: 上面有墙
4: 右面有墙
8: 下面有墙
例如,11=8+2+1,表示此点除了右面,余下三面都有墙。
【输出格式】
第一行给出初始房间数。(例如图中有5个连通块,即5个房间)
第二行给出初始最大的房间。(图中便是(1,1)所在房间)
第三行给出打破一面墙所得的房间面积最大值。
第四行给出打破的是哪一面墙。(例如本题输出样例,便表示是(4,1)东面的墙)
注意:描述墙的方式,是用墙左面或下面的点的左边,加上墙相对点的方向('N'or'E')。如果有多面墙可供打破,那么优先选择最左面的,再优先最下面的,再优先墙相对点的方向为'N'的。
【数据范围】
1<=N,M<=50
【输入样例】
7 4
11 6 11 6 3 10 6
7 9 6 13 5 15 5
1 10 12 7 13 7 5
13 11 10 8 10 12 13
【输出样例】
5
9
16
4 1 E
------------------------------------------------------------------------------------------------------------------------------------------------
【分析】
裸FloodFill。
好好画图,注意细节,需要存的大数组也就是每个点的信息和Fill出的每块的大小了。边是不能存的,计算一下会发现空间不够。
------------------------------------------------------------------------------------------------------------------------------------------------
【总结】
题目开始难起来了,要开始分析时空复杂度了。不能无脑刷了!
第一次,超空间了,没计算空间。
Edge定义成了邻接矩阵,2500²=6,250,000≈6M,由于是int,故6×4=24M,显然超过了USACO十几M内存的限制。
第二次,第七个点被卡主,原因是运行时间远超1s。
为了调试方便,觉得应该不会超时,就没删屏幕输出。
第三次,仍是第七个点,原因是运行时错误。
这数据是极限数据,N=M=50,所有位置都有墙。显然,应该是程序没判断好边界情况。
调试过程中,慢慢发现,问题出在超内存上!
墙满的时候,邻接表还不如邻接矩阵呢。。我竟然忘了这个!既然邻接表可能被占满,那显然比邻接矩阵更占空间啊……
仔细一想,我SB了……这题根本不用存边嘛……直接存点的信息就好了,一个裸的FloodFill愣是被我搞得如此复杂……
经过几次提交和修改,第七次,AC。
代码得改漂亮些……不能太难看了-.-
------------------------------------------------------------------------------------------------------------------------------------------------
【代码】
/*
ID: icedrea1
PROB: castle
LANG: C++
*/ #include <iostream>
#include <fstream>
using namespace std; int N,M,num[+*];
struct MapNode
{
int mark;
int wall;
}Node[+][+]; // Node[i][j]: i行j列的点 void Fill(int x,int y,int mark)
{
int wall=Node[x][y].wall;
Node[x][y].mark=mark; ++num[mark];
if(y> && (wall&)== && Node[x][y-].mark==) Fill(x,y-,mark); // 1 west (x,y-1)
if(x> && (wall&)== && Node[x-][y].mark==) Fill(x-,y,mark); // 2 north (x-1,y)
if(y<M && (wall&)== && Node[x][y+].mark==) Fill(x,y+,mark); // 4 east (x,y+1)
if(x<N && (wall&)== && Node[x+][y].mark==) Fill(x+,y,mark); // 8 south (x+1,y)
}
int FloodFill()
{
int mark,sum;
for(mark=,sum=;sum<N*M;++mark) // sum==N×M说明填满了,FlookFill结束
{
// 本次FlookFill的编号为mark
int x,y;
bool p=true;
for(int i=;i<=N&&p;++i)
for(int j=;j<=M&&p;++j)
if(Node[i][j].mark==) { x=i; y=j; p=false; }
// 从(x,y)开始本次FloodFill
Fill(x,y,mark); sum+=num[mark];
}
return mark-;
} int main()
{
ifstream in("castle.in");
ofstream out("castle.out"); in>>M>>N;
for(int i=;i<=N;++i)
for(int j=;j<=M;++j) in>>Node[i][j].wall; int cnt=FloodFill(),room=;
for(int i=;i<=cnt;++i)
if(num[i]>room) room=num[i]; int x,y,area=; char wall;
for(int j=,t;j<=M;++j)
for(int i=N;i>=;--i)
{
t=num[Node[i][j].mark]+num[Node[i-][j].mark];
if(i> && Node[i][j].mark!=Node[i-][j].mark && t>area) { area=t; x=i; y=j; wall='N'; }
t=num[Node[i][j].mark]+num[Node[i][j+].mark];
if(j<M && Node[i][j].mark!=Node[i][j+].mark && t>area) { area=t; x=i; y=j; wall='E'; }
} out<<cnt<<endl;
out<<room<<endl;
out<<area<<endl;
out<<x<<" "<<y<<" "<<wall<<endl; in.close();
out.close();
return ;
}
USACO Section2.1 The Castle 解题报告的更多相关文章
- USACO Section2.1 Healthy Holsteins 解题报告 【icedream61】
holstein解题报告 --------------------------------------------------------------------------------------- ...
- USACO Section2.2 Preface Numbering 解题报告 【icedream61】
preface解题报告----------------------------------------------------------------------------------------- ...
- USACO Section2.1 Hamming Codes 解题报告 【icedream61】
hamming解题报告----------------------------------------------------------------------------------------- ...
- USACO Section2.3 Controlling Companies 解题报告 【icedream61】
concom解题报告------------------------------------------------------------------------------------------ ...
- USACO Section2.3 Money Systems 解题报告 【icedream61】
money解题报告------------------------------------------------------------------------------------------- ...
- USACO Section2.3 Zero Sum 解题报告 【icedream61】
zerosum解题报告----------------------------------------------------------------------------------------- ...
- USACO Section2.3 Cow Pedigrees 解题报告 【icedream61】
nocows解题报告------------------------------------------------------------------------------------------ ...
- USACO Section2.3 Longest Prefix 解题报告 【icedream61】
prefix解题报告------------------------------------------------------------------------------------------ ...
- USACO Section2.2 Party Lamps 解题报告 【icedream61】
lamps解题报告------------------------------------------------------------------------------------------- ...
随机推荐
- COGS 2075. [ZLXOI2015][异次元圣战III]ZLX的陨落
★★☆ 输入文件:ThefallingofZLX.in 输出文件:ThefallingofZLX.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] 正当革命如火如 ...
- Thymeleaf 随记
一.基础写法: th:text='${数据} ,其中text可以修改成其他,如href,value,class....看需求 <p th:text='${后台返回的数据}'>静态文本&l ...
- SAP成都研究院大卫哥:SAP C4C中国本地化之微信小程序集成
今天的文章来自Wu David,SAP成都研究院C4C开发团队的架构师,在加入团队之前曾经在SAP上海研究院工作,组内同事习惯亲切地称呼他为大卫哥. 大卫哥身高据Jerry目测有1米8以上,是成都C4 ...
- 字符串处理(POJ1782)
题目链接:http://poj.org/problem?id=1782 解题报告: #include <iostream> #include <cstdio> #include ...
- Poj(2488),按照字典序深搜
题目链接:http://poj.org/problem?id=2488 思路:按照一定的字典序深搜,当时我的想法是把所有的可行的路径都找出来,然后字典序排序. 后来,凡哥说可以在搜索路径的时候就按照字 ...
- vuejs非父子组件传值
当父组件要给孙子,或者孙子与孙子要传值的时候怎么传,一层一层传太麻烦了,vuejs提供了一中模式叫发布订阅模式(观察者模式,bus,总线)来处理非父子组件间的传值 <div id='root'& ...
- linux df -h显示空间信息不正确
在linux系统上有时发现使用df 查看磁盘已使用空间和使用du统计的不相等,例如: [running]root@slave11:/$ df -h Filesystem Size ...
- jquery 添加和删除节点
// 增加一个三和一节点 function addPanel() { // var newPanel = $('.my-panel').clone(true) var newPanel = $(&qu ...
- Windows Server 2008 IIS 并发请求设置
更新服务器的时候,突然发现部分机器出现了错误,大致描述如下 HTTP Error 503.2 - Service Unavailable 正在超过 serverRuntime@appConcurren ...
- HTML介绍和head标签-01
主要内容 web标准 浏览器介绍 开发工具介绍 HTML介绍 HTML颜色介绍 HTML规范 HTML结构详解 一.web标准 web准备介绍: w3c:万维网联盟组织,用来制定web标准的机构(组织 ...