题目名称 671. 城堡
输入输出 castle.in/out
难度等级 ★☆
时间限制 1000 ms (1 s)
内存限制 128 MiB
测试数据 8
题目来源 GravatarMakazeu 于2012-03-29加入
开放分组 全部用户
提交状态
分类标签
USACO 搜索法 种子填充 并查集
分享题解
通过:113, 提交:292, 通过率:38.7%
Gravatarbhiaibogf 100 0.000 s 0.00 MiB Pascal
Gravatar521 100 0.000 s 0.00 MiB C++
Gravatar521 100 0.000 s 0.00 MiB C++
GravatarYoungsc 100 0.000 s 0.00 MiB C++
Gravataryrtiop 100 0.000 s 0.00 MiB C++
Gravatarsywgz 100 0.000 s 0.00 MiB C++
Gravatar超人 100 0.000 s 0.00 MiB C++
Gravatar超人 100 0.000 s 0.00 MiB C++
GravatarQILIN 100 0.002 s 0.18 MiB Pascal
Gravatar赵寒烨 100 0.002 s 0.20 MiB Pascal
本题关联比赛
20140714上午练习
20140714下午练习
二进制状态表示之搜索中的应用
关于 城堡 的近10条评论(全部评论)
并查集搞,答案优先级写成狗orz
Gravatarliuyu
2017-10-20 09:53 14楼
再不读题我吃tab(.
GravatarMealy
2017-02-13 20:45 13楼
恶心死了呜呜呜呜……(貌似我还算是写的比较清爽的,不到七十行……)
Gravatar浮生随想
2016-10-21 07:26 12楼
最优解方向什么的写的好烦→_→
Gravataropen the window
2016-09-28 10:01 11楼
这道题完全否定了我在poj提交时用并查集写的思想QAQ (太难玩
Gravatar安呐一条小咸鱼。
2016-07-14 06:24 10楼
题目太绕太绕太绕
Gravatarmpsmps?mpsmps!
2015-06-30 23:45 9楼
写了一个上午= =膜拜各位大神40分钟就写完
好吧我承认我是一边看贴吧一边写的
GravatarHouJikan
2014-07-29 11:53 8楼
不是两个房间吗?怎么倒数第二组数据只有一个房间???????
GravatarSatoshi
2014-07-15 10:42 7楼
数组开小了······
Gravatar752199526
2014-07-15 08:03 6楼
Gravatar农场主
2014-07-14 14:38 5楼

671. 城堡

★☆   输入文件:castle.in   输出文件:castle.out   简单对比
时间限制:1 s   内存限制:128 MiB

【题目描述】

    我们憨厚的 $USACO$ 主人公农夫约翰$(Farmer John)$以无法想象的运气,在他生日那天收到了一份特别的礼物:一张“幸运爱尔兰”(一种彩票)。结果这张彩票让他获得了这次比赛唯一的奖品——坐落于爱尔兰郊外的一座梦幻般的城堡!

    喜欢吹嘘的农夫约翰立刻回到有着吹嘘传统的威斯康辛老家开始吹嘘了, 农夫约翰想要告诉他的奶牛们关于他城堡的一切。他需要做一些吹嘘前的准备工作:比如说知道城堡有多少个房间,每个房间有多大。另外,农夫约翰想要把一面单独的墙(指两个单位间的墙)拆掉以形成一个更大的房间。 你的工作就是帮农夫约翰做以上的准备,算出房间数与房间的大小。

    城堡的平面图被划分成 $M*N(1 \leq M,N \leq 50)$ 个正方形的单位,一个这样的单位可以有 $0$ 到 $4$ 面墙环绕。城堡周围一定有外墙环绕以遮风挡雨。(就是说平面图的四周一定是墙。)

请仔细研究下面这个有注解的城堡平面图:

    1   2   3   4   5   6   7
  #############################
1 #   |   #   |   #   |   |   #
  #####---#####---#---#####---#   
2 #   #   |   #   #   #   #   #
  #---#####---#####---#####---#
3 #   |   |   #   #   #   #   #   
  #---#########---#####---#---#
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$"(东))。

【样例输入】

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

【样例说明】

样例数据描述的城堡和问题描述中的例子一致。

【来源】

USACO 2.1.1