洛谷P1457 城堡 The Castle
P1457 城堡 The Castle
- 137通过
- 279提交
- 题目提供者该用户不存在
- 标签USACO
- 难度提高+/省选-
提交 讨论 题解
最新讨论
- 暂时没有讨论
题目描述
我们憨厚的USACO主人公农夫约翰(Farmer John)以无法想象的运气,在他生日那天收到了一份特别的礼物:一张“幸运爱尔兰”(一种彩票)。结果这张彩票让他获得了这次比赛唯一的奖品——坐落于爱尔兰郊外的一座梦幻般的城堡!
喜欢吹嘘的农夫约翰立刻回到有着吹嘘传统的威斯康辛老家开始吹嘘了, 农夫约翰想要告诉他的奶牛们关于他城堡的一切。他需要做一些吹嘘前的准备工作:比如说知道城堡有多少个房间,每个房间有多大。另外,农夫约翰想要把一面单独的墙(指两个单位间的墙)拆掉以形成一个更大的房间。 你的工作就是帮农夫约翰做以上的准备,算出房间数与房间的大小。
城堡的平面图被划分成M*N(1 <=M,N<=50)个正方形的单位,一个这样的单位可以有0到4面墙环绕。城堡周围一定有外墙环绕以遮风挡雨。(就是说平面图的四周一定是墙。)
请仔细研究下面这个有注解的城堡平面图:
友情提示,这个城堡的平面图是7×4个单位的。一个“房间”的是平面图中一个由“#”、“-”、“|”围成的格子(就是图里面的那一个个的格子)。比如说这个样例就有5个房间。(大小分别为9、7、3、1、8个单位(排名不分先后))
移去箭头所指的那面墙,可以使2个房间合为一个新房间,且比移去其他墙所形成的房间都大。(原文为:Removing the wall marked by the arrow merges a pair of rooms to make the largest possible room that can be made by removing a single wall. )
城堡保证至少有2个房间,而且一定有一面墙可以被移走。
输入输出格式
输入格式:
第一行有两个整数:M和N 城堡的平面图用一个由数字组成的矩阵表示,一个数字表示一个单位,矩阵有N行M列。输入与样例的图一致。
每一个单位的数字告诉我们这个单位的东西南北是否有墙存在。每个数字是由以下四个整数的某个或某几个或一个都没有加起来的。
1: 在西面有墙
2: 在北面有墙
4: 在东面有墙
8: 在南面有墙
城堡内部的墙会被规定两次。比如说(1,1)南面的墙,亦会被标记为(2,1)北面的墙。
输出格式:
输出包含如下4行:
第 1 行: 城堡的房间数目。
第 2 行: 最大的房间的大小
第 3 行: 移除一面墙能得到的最大的房间的大小
第 4 行: 移除哪面墙可以得到面积最大的新房间。
选择最佳的墙来推倒。有多解时选最靠西的,仍然有多解时选最靠南的。同一格子北边的墙比东边的墙更优先。
用该墙的南邻单位的北墙或西邻单位的东墙来表示这面墙,方法是输出邻近单位的行数、列数和墙的方位("N"(北)或者"E"(东))。
输入输出样例
输入样例#1:
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
输出样例#1:
5
9
16
4 1 E
说明
USACO 2.1
翻译来自NOCOW
分析:建图比较恶心,用一个三维数组储存(i,j)的哪一个方向有墙,但是怎么处理呢?可以注意到给的数字是倍增的,想到倍增的基本算法,从大到小减,那么处理完之后第一问就容易解决了,floodfill,dfs直接秒杀,可以在处理第一问的时候顺便记录一下第二问的答案,第三问和第四问就是枚举两个不同的连通块,看连通以后的大小即可,这些需要的数据都可以在dfs中解决.
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; int n, m,wall[][][],id[][],col,size[],ansi,ansj;
char ans; void dfs(int x, int y)
{
if (id[x][y] == col)
return;
id[x][y] = col;
size[col]++;
if (!wall[x][y][])
dfs(x + , y);
if (!wall[x][y][])
dfs(x, y + );
if (!wall[x][y][])
dfs(x - , y);
if (!wall[x][y][])
dfs(x, y - );
} int main()
{
scanf("%d%d", &m, &n);
for (int i = ; i <= n; i++)
for (int j = ; j <= m; j++)
{
int temp;
scanf("%d", &temp);
if (temp >= )
{
temp -= ;
wall[i][j][] = ;
}
if (temp >= )
{
temp -= ;
wall[i][j][] = ;
}
if (temp >= )
{
temp -= ;
wall[i][j][] = ;
}
if (temp >= )
{
temp -= ;
wall[i][j][] = ;
}
}
for (int i = ; i <= n; i++)
for (int j = ; j <= m; j++)
{
if (!id[i][j])
{
col++;
dfs(i, j);
}
}
printf("%d\n", col);
int maxi = size[];
for (int i = ; i <= col; i++)
if (size[i] > maxi)
maxi = size[i];
printf("%d\n", maxi);
maxi = ;
for (int i = ; i <= n; i++)
for (int j = ; j <= m; j++)
{
if (i != && wall[i][j][] == && id[i][j] != id[i - ][j])
{
int temp = size[id[i][j]] + size[id[i - ][j]];
if (temp > maxi)
{
maxi = temp;
ansi = i;
ansj = j;
ans = 'N';
}
if (temp == maxi)
if ((j < ansj) || (i > ansi && j <= ansj))
{
ansi = i;
ansj = j;
ans = 'N';
}
}
if (j != m && wall[i][j][] == && id[i][j] != id[i][j + ])
{
int temp = size[id[i][j]] + size[id[i][j + ]];
if (temp > maxi)
{
maxi = temp;
ansi = i;
ansj = j;
ans = 'E';
}
if (temp == maxi)
if (j < ansj || (i > ansi && j <= ansj))
{
ansi = i;
ansj = j;
ans = 'E';
}
}
}
printf("%d\n", maxi);
printf("%d %d %c\n", ansi, ansj, ans); return ;
}
洛谷P1457 城堡 The Castle的更多相关文章
- 洛谷 P1457 城堡 The Castle 解题报告
P1457 城堡 The Castle 题目描述 我们憨厚的USACO主人公农夫约翰(Farmer John)以无法想象的运气,在他生日那天收到了一份特别的礼物:一张"幸运爱尔兰" ...
- 洛谷 P1457 城堡 The Castle
P1457 城堡 The Castle 题目描述 我们憨厚的USACO主人公农夫约翰(Farmer John)以无法想象的运气,在他生日那天收到了一份特别的礼物:一张“幸运爱尔兰”(一种彩票).结果这 ...
- 洛谷—— P1457 城堡 The Castle
https://www.luogu.org/problem/show?pid=1457 题目描述 我们憨厚的USACO主人公农夫约翰(Farmer John)以无法想象的运气,在他生日那天收到了一份特 ...
- 题解 洛谷P1457 【城堡 The Castle】
这道题,看似很烦,无从下手,但其实只要用位运算和联通快就能水过了呀. 首先,输入:似乎大意是把一个数拆成二进数的相加,分别表示\((i,j)\)东南西北是否有墙.\(1\)表示西,\(2\)表示北,\ ...
- P1457 城堡 The Castle
轻度中毒 原题 :The Castle 以下为题解部分:明明辣么简单的一道题,硬是搞了1.5h,WTF?以下列出本题的一些要点. 搜索(DFS)嘛,染色嘛,统计大小嘛,很容易想,也很更易处理. 接下来 ...
- P1457 城堡 The Castle 位运算+BFS+思维(难题,好题)
题目描述 我们憨厚的USACO主人公农夫约翰(Farmer John)以无法想象的运气,在他生日那天收到了一份特别的礼物:一张"幸运爱尔兰"(一种彩票).结果这张彩票让他获得了这次 ...
- 洛谷P1263 宫廷守卫
P1263 宫廷守卫 题目描述 从前有一个王国,这个王国的城堡是一个矩形,被分为M×N个方格.一些方格是墙,而另一些是空地.这个王国的国王在城堡里设了一些陷阱,每个陷阱占据一块空地. 一天,国王决定在 ...
- $loj10156/$洛谷$2016$ 战略游戏 树形$DP$
洛谷loj Desription Bob 喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的方法.现在他有个问题. 现在他有座古城堡,古城堡的路形成一棵树.他要在这棵树的节点上放置最少数 ...
- 洛谷1640 bzoj1854游戏 匈牙利就是又短又快
bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...
随机推荐
- Apache日志不记录图片文件设置方法和来源日志的配置
Apache日志不记录图片文件设置方法 <FilesMatch "\.(ico|gif|jpg|swf)">SetEnv IMAG 1</FilesMatch&g ...
- 如何写出小而清晰的函数?(JS 版)
本文以 JavaScript 为例,介绍了该如何优化函数,使函数清晰易读,且更加高效稳定. 软件的复杂度一直在持续增长.代码质量对于保证应用的可靠性.易扩展性非常重要. 然而,几乎每一个开发者,包括我 ...
- GL_GL系列 - 预算管理分析(案例)
2014-07-09 Created By BaoXinjian
- suibi 117
-Djava.net.preferIPv4Stack=true re.findall(r"^(\d+)" , content) content = content.replace( ...
- Python 向上取整的算法
一.初衷: 有时候我们分页展示数据的时候,需要计算页数.一般都是向上取整,例如counts=205 pageCouts=20 ,pages= 11 页. 一般的除法只是取整数部分,达不到要求. 二.方 ...
- python (11)文件的读写 按行读文件
读文件: 读取文件 f = open('\info.txt') fil = f.read() f.close() 按行读文件: f = open("info.txt") while ...
- A+B问题 涉及EOF
输入将包括一系列对的整数a和b,通过一空间,一对每行整数分离的. 产量 对于每对输入的整数a和b你应该输出的a和b的总和在一行,并用输出的一个行中输入每一行. 样本输入 1 5 2 3 样本输 ...
- Table View滑动时报错
学习表视图(Table View)的应用时,自己写了个demo,最后表格出来了,可是滑动时报错了,报错如下: 这是我ViewController.m部分的代码: #import "ViewC ...
- 全文检索引擎Solr系列—–全文检索基本原理
场景:小时候我们都使用过新华字典,妈妈叫你翻开第38页,找到“坑爹”所在的位置,此时你会怎么查呢?毫无疑问,你的眼睛会从38页的第一个字开始从头至尾地扫描,直到找到“坑爹”二字为止.这种搜索方法叫做顺 ...
- java生产随机字符串
public static String getRandomString(int length) { //length表示生成字符串的长度 String base = "abcdefghij ...