- 浏览: 37810 次
- 性别:
- 来自: 北京
最新评论
-
andyshar:
请问如何在现有的hadoop环境中安装?
Hadoop集群监控系统Ambari安装 -
qingtangpaomian:
失败123 写道您好楼主: 我装好之后为啥老是最后一 ...
Hadoop集群监控系统Ambari安装 -
失败123:
您好楼主: 我装好之后为啥老是最后一步Cluster ...
Hadoop集群监控系统Ambari安装
USACO - 2.1.1 - The Castle
原创文章转载请注明出处
摘要:floodfill , 图论
一. 题目翻译
1. 描述:
我们憨厚的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个房间,而且一定有一面墙可以被移走。
2. 格式:
INPUT FORMAT:
第一行有两个整数:M和N 城堡的平面图用一个由数字组成的矩阵表示,一个数字表示一个单位,矩阵有N行M列。输入与样例的图一致。
每一个单位的数字告诉我们这个单位的东西南北是否有墙存在。每个数字是由以下四个整数的某个或某几个或一个都没有加起来的。
1: 在西面有墙
2: 在北面有墙
4: 在东面有墙
8: 在南面有墙
城堡内部的墙会被规定两次。比如说(1,1)南面的墙,亦会被标记为(2,1)北面的墙。
OUTPUT FORMAT:
输出包含如下4行:
第 1 行: 城堡的房间数目。
第 2 行: 最大的房间的大小
第 3 行: 移除一面墙能得到的最大的房间的大小
第 4 行: 移除哪面墙可以得到面积最大的新房间。
选择最佳的墙来推倒。有多解时选(重心)最靠西的(仍然有多解时选这些里面(重心)最靠南的)。(注:同一格子北边的墙比东边的墙重心更靠西) 用该墙的南邻单位的北墙或西邻单位的东墙来表示这面墙,方法是输出邻近单位的行数、列数和墙的方位("N"(北)或者"E"(东))。
SAMPLE INPUT:
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
SAMPLE OUTPUT:
5
9
16
4 1 E
1. 题意理解(将问题分析清楚,大致用什么思路):
这道题目的基础思路先是使用图论中的floodfill算法对城堡中所有房间进行着色,在同一个联通分支的房间有相同的颜色。然后依次遍历每个房间,尝试与该房间的东、南、西、北的房间合并,如果产生房间面积最大,则将结果记录并最后输出。
2. 具体实现(具体实现过程中出现的问题):
题目先对简单,请参考代码中的说明。
3. 需要注意的细节:
这里要特别注意枚举的顺序,题目有如下说明“有多解时选(重心)最靠西的(仍然有多解时选这些里面(重心)最靠南的)”,所以最后的枚举我们要按照从西向东,从南到北的顺序。
4. 启示:
floodfill算法注意积累,题目中有多解时的判断条件一定要注意。有时间的话了解一下其他的解法。
三. 代码
/* ID:fightin1 LANG:JAVA TASK:castle */ import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.util.HashMap; import java.util.LinkedList; import java.util.Scanner; public class castle { static int[][] colors; static int[][] walls; static int colNum; static int rowNum; static HashMap<Integer,Integer> counts; static int max; static int maxJoin; static String maxWall; public static void main(String[] args) { try { // Scanner in = new Scanner(System.in); // PrintWriter pw = new PrintWriter(System.out); Scanner in = new Scanner(new BufferedReader(new FileReader( "castle.in"))); PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter( "castle.out"))); colNum = in.nextInt(); rowNum = in.nextInt(); colors = new int[rowNum+2][colNum+2]; walls = new int[rowNum+2][colNum+2]; counts = new HashMap<Integer, Integer>(); counts.put(0, 0); max = 0; int color = 1; for (int i=1;i<=rowNum;i++){ for (int j=1;j<=colNum;j++){ walls[i][j] = in.nextInt(); } } for (int i=1;i<=rowNum;i++){ for (int j=1;j<=colNum;j++){ if (colors[i][j]==0){ LinkedList<Node> ll = new LinkedList<Node>(); ll.add(new Node(i,j)); colors[i][j] = color; bfs(ll,color); // pw.println("after i = "+i+", j = "+j); // for (int k=1;k<=rowNum;k++){ // for (int l=1;l<=colNum;l++){ // pw.print(colors[k][l]+" "); // } // pw.println(); // } // pw.println("count is : "+counts.get(colors[i][j])); color ++ ; } } } pw.println(color-1); pw.println(max); maxJoin = max; for (int j=1;j<=colNum;j++){ for (int i=rowNum;i>=1;i--){ if(colors[i][j]!=colors[i][j-1]){ if (counts.get(colors[i][j])+counts.get(colors[i][j-1])>maxJoin){ maxJoin = counts.get(colors[i][j])+counts.get(colors[i][j-1]); maxWall = i+" "+j+"W"; } } if(colors[i][j]!=colors[i+1][j]){ if (counts.get(colors[i][j])+counts.get(colors[i+1][j])>maxJoin){ maxJoin = counts.get(colors[i][j])+counts.get(colors[i+1][j]); maxWall = i+" "+j+" S"; } } if(colors[i][j]!=colors[i-1][j]){ if (counts.get(colors[i][j])+counts.get(colors[i-1][j])>maxJoin){ maxJoin = counts.get(colors[i][j])+counts.get(colors[i-1][j]); maxWall = i+" "+j+" N"; } } if(colors[i][j]!=colors[i][j+1]){ if (counts.get(colors[i][j])+counts.get(colors[i][j+1])>maxJoin){ maxJoin = counts.get(colors[i][j])+counts.get(colors[i][j+1]); maxWall = i+" "+j+" E"; } } } } pw.println(maxJoin); pw.println(maxWall); pw.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void bfs(LinkedList<Node> ll, int color){ int count = 0; while (ll.size()!=0){ Node node = ll.removeFirst(); int wall = walls[node.x][node.y]; count ++; if (wall>=8){ wall = wall - 8; } else { if(node.x+1<=rowNum){ if (colors[node.x+1][node.y]==0){ ll.add(new Node(node.x+1,node.y)); colors[node.x+1][node.y]=color; } } } if (wall >=4){ wall = wall -4; } else { if(node.y+1<=colNum){ if (colors[node.x][node.y+1]==0){ ll.add(new Node(node.x,node.y+1)); colors[node.x][node.y+1]=color; } } } if (wall >=2){ wall = wall -2; } else { if(node.x-1>=1){ if (colors[node.x-1][node.y]==0){ ll.add(new Node(node.x-1,node.y)); colors[node.x-1][node.y]=color; } } } if (wall == 0){ if(node.y-1>=1){ if (colors[node.x][node.y-1]==0){ ll.add(new Node(node.x,node.y-1)); colors[node.x][node.y-1]=color; } } } } counts.put(color, count); if (count > max){ max = count; } } } class Node{ int x ; int y ; public Node(int x, int y) { this.x = x; this.y = y; } }
发表评论
-
USACO - 3.2.2 - Stringsobits
2012-08-23 16:02 811原创文章转载请注明 ... -
USACO - 3.2.1 - Factorials
2012-08-23 16:01 702原创文章转载请注明出处 摘要:动态规划 ... -
USACO - 3.1.6 - Stamps
2012-08-23 16:01 1039原创文章转载请注明 ... -
USACO - 3.1.5 - Contact
2012-08-23 16:01 914原创文章转载请注明出处 摘要:二叉树的应用 , ... -
USACO - 3.1.3 - Humble Numbers
2012-08-23 16:00 716原创文章转载请注明 ... -
USACO - 3.1.2 - Score Inflation
2012-08-22 10:05 908原创文章转载请注明出处 摘要:动态规划 ... -
USACO - 3.1.1 - Agri-Net
2012-08-22 10:04 859原创文章转载请注明出处 摘要:Prim算法 , ... -
USACO - 2.4.5 - Fractions to Decimals
2012-08-22 10:04 962原创文章转载请注明出处 摘要:模拟 , 数论 ... -
USACO - 2.4.4 - Bessie Come Home
2012-08-22 10:04 910原创文章转载请注明出处 摘要:Dijkstra ... -
USACO - 2.4.2 - Overfencing
2012-08-22 10:03 1005原创文章转载请注明 ... -
USACO - 2.4.1 - The Tamworth Two
2012-08-21 10:37 720原创文章转载请注明出处 摘要:模拟 ... -
USACO - 2.3.5 - Controlling Companies
2012-08-21 10:37 1306原创文章转载请注明出处 摘要:BFS , 模拟 ... -
USACO - 2.3.4 - Money Systems
2012-08-21 10:37 870原创文章转载请注明 ... -
USACO - 2.3.3 - Zero Sum
2012-08-21 10:36 746原创文章转载请注明出处 摘要:dfs , 枚举 ... -
USACO - 2.3.2 - Cow Pedigrees
2012-08-21 10:36 1011原创文章转载请注明 ... -
USACO - 2.3.1 - Longest Prefix
2012-08-20 20:31 1043原创文章转载请注明 ... -
USACO - 2.2.4 - Party Lamps
2012-08-20 20:30 1213原创文章转载请注明出处 摘要:枚举,三星 ... -
USACO - 2.2.3 - Runaround Numbers
2012-08-20 20:30 660原创文章转载请注明 ... -
USACO - 2.2.2 - Subset Sums
2012-08-20 20:30 697原创文章转载请注明出处 摘要:动态规划 ,0- ... -
USACO - 2.2.1 - Preface Numbering
2012-08-20 20:29 892原创文章转载请注明出处 摘要:模拟 , 数学分析 ...
相关推荐
USACO题目,Greedy Gift Givers
此c++代码实现了USACO上Bessie Come Home的问题,并运用了弗洛伊德算法
此C++程序是实现了USACO网站上的Magic Squares的问题。
该题来自USACO,为最长串的查找,此处方法很笨,有更好方法
USACO chapter one.May hope it useful to someone
USACO chapter two.Useful for beginners.
usaco 上的题目barn1,beads,calfflac,可到那里查看具体题目
Notes-USACO-2021-弹簧
USACO-Cpp
[USACO 2.1.1]城堡题目答案 想要题解可以关注+私信
C-Usaco-Work:Usaco在C中的工作
USACO-实践USACO 培训网站的工作实践代码! 100% 工作 - 大部分优化 - 混合语言
这是USACO2001-2007月赛全集。 usaco是美国中学生的官方竞赛网站。是美国著名在线题库,专门为信息学竞赛选手准备。推荐直接阅读英语原文,既准确可靠又可提高英语水平。做题方式模拟正式比赛,采用标准测评机、文件...
资源包包括USACO 2001-2007年月赛的测试数据;usaco月赛十年题典(2000-2009),usaco月赛2002-2008题解。单独下载需资源分30分以上。为了方便编程爱好者,我这边统一下载打包。欢迎下载。
usaco 2010-2011 nov news,喜欢usaco的朋友可以看看
USACO培训网站 我为章节解决方案。 每个文件的多行USACO标识信息注释 第1章全部的解决方案 第2章全部的解决方案
USACO-TurtleCamera 该存储库包含我对USACO问题的所有解决方案。 CSE 199工作区目录将是我用来帮助开发USACO课程的主要目录。
我的USACO题解和程序
Java中的USACO金问题 YYMM 姓名 文件夹 笔记 代码 1812 美食 1812 牛适应性 1812 团队合作
USACO-Guide