P1457 城堡 The Castle

题目描述

我们憨厚的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个小时,直接1A了

具体细节参加代码,多写函数比较清楚


  1. #include <cstdio>
  2. #include <cstring>
  3. int max(int x,int y){return x>y?x:y;}
  4. const int N=52;
  5. const int X[5]={0,0,1,0,-1};
  6. const int Y[5]={0,-1,0,1,0};
  7. int toward[N][N][5],n,m,used[N][N];
  8. void init()
  9. {
  10. scanf("%d%d",&m,&n);
  11. for(int i=1;i<=n;i++)
  12. for(int j=1;j<=m;j++)
  13. {
  14. int typ;
  15. scanf("%d",&typ);
  16. if(typ>=8)
  17. toward[i][j][3]=1,typ-=8;
  18. if(typ>=4)
  19. toward[i][j][2]=1,typ-=4;
  20. if(typ>=2)
  21. toward[i][j][1]=1,typ-=2;
  22. if(typ>=1)
  23. toward[i][j][4]=1,typ-=1;
  24. }
  25. }
  26. int dfs(int i,int j,int siz)
  27. {
  28. used[i][j]=1;
  29. for(int k=1;k<=4;k++)
  30. if(!toward[i][j][k]&&!used[i+Y[k]][j+X[k]])
  31. siz+=dfs(i+Y[k],j+X[k],1);
  32. return siz;
  33. }
  34. void work()
  35. {
  36. int mx=0,cnt=0,tmp,x,y,typ;
  37. for(int i=1;i<=n;i++)
  38. for(int j=1;j<=m;j++)
  39. if(!used[i][j])
  40. mx=max(mx,dfs(i,j,1)),cnt++;
  41. printf("%d\n%d\n",cnt,mx);
  42. mx=0;
  43. for(int j=1;j<=m;j++)
  44. for(int i=n;i>=1;i--)
  45. for(int k=1;k<=2;k++)
  46. {
  47. if(i==1&&k==1) continue;
  48. if(j==m&&k==2) continue;
  49. if(toward[i][j][k])
  50. {
  51. toward[i][j][k]=0;
  52. memset(used,0,sizeof(used));
  53. tmp=dfs(i,j,1);
  54. if(tmp>mx)
  55. {
  56. mx=tmp;
  57. y=i,x=j,typ=k;
  58. }
  59. toward[i][j][k]=1;
  60. }
  61. }
  62. printf("%d\n%d %d ",mx,y,x);
  63. if(typ==1) printf("N\n");
  64. else printf("E\n");
  65. }
  66. int main()
  67. {
  68. init();
  69. work();
  70. return 0;
  71. }

洛谷 P1457 城堡 The Castle 解题报告的更多相关文章

  1. 洛谷P1457 城堡 The Castle

    P1457 城堡 The Castle 137通过 279提交 题目提供者该用户不存在 标签USACO 难度提高+/省选- 提交  讨论  题解 最新讨论 暂时没有讨论 题目描述 我们憨厚的USACO ...

  2. 洛谷 P1457 城堡 The Castle

    P1457 城堡 The Castle 题目描述 我们憨厚的USACO主人公农夫约翰(Farmer John)以无法想象的运气,在他生日那天收到了一份特别的礼物:一张“幸运爱尔兰”(一种彩票).结果这 ...

  3. 洛谷—— P1457 城堡 The Castle

    https://www.luogu.org/problem/show?pid=1457 题目描述 我们憨厚的USACO主人公农夫约翰(Farmer John)以无法想象的运气,在他生日那天收到了一份特 ...

  4. 洛谷_Cx的故事_解题报告_第四题70

    1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h>   struct node {     long x,y,c; ...

  5. 洛谷 P2317 [HNOI2005]星际贸易 解题报告

    P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...

  6. 洛谷 P3802 小魔女帕琪 解题报告

    P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...

  7. 洛谷 P2606 [ZJOI2010]排列计数 解题报告

    P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...

  8. 洛谷1303 A*B Problem 解题报告

    洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...

  9. 洛谷 P3084 [USACO13OPEN]照片Photo 解题报告

    [USACO13OPEN]照片Photo 题目描述 农夫约翰决定给站在一条线上的\(N(1 \le N \le 200,000)\)头奶牛制作一张全家福照片,\(N\)头奶牛编号\(1\)到\(N\) ...

随机推荐

  1. C++面试题:list和vector有什么区别

    C++面试题:list和vector有什么区别?考点:理解list和vector的区别出现频率:★★★★解析:vector和数组类似,它拥有一段连续的内存空间,并且起始地址不变,因此它能非常好的支持随 ...

  2. 20155323刘威良《网络对抗》Exp7 网络欺诈防范

    20155323刘威良<网络对抗>Exp7 网络欺诈防范 实践目标 理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法. 实践内容 (1)简单应用SET工具建立冒名网站 (1分 ...

  3. SimpleDateFormat-时间格式化中的大小写字符

    一.SimpleDateFormat: 这个类是用来格式化date类型数据为指定格式的时间的 使用的而时候,总是区分不清 yyyy-mm-dd yyyy-MM-dd 而使用不同的大小写字符格式化出来的 ...

  4. 蓝牙重启case之:hardware error

    蓝牙的通信分为host和controller,host端发送数据和命令到controller,controller 上传event以及数据到host端,这要求上下两端的通信要求状态一致性. 当发生状态 ...

  5. 6、Docker图形化管理(Portainer)

    一.Portainer简介 Portainer是Docker的图形化管理工具,提供状态显示面板.应用模板快速部署.容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作).事件日志显示.容器控 ...

  6. 有关ADO.NET基础中的基础的熟悉过程

    现在对于ADO.NET基础的理解与记忆并不严谨和完善 所以,只写一点关于自己的理解,嗯,一种去转换思维理解的方法吧,算是吧 希望各位前辈或者同学,积极指出其中的错误和偏差 个人对于刚接触的ADO.NE ...

  7. 如何在百度云虚拟机中配置thinkphp5,并且url去掉index.php

    第一步:将public目录下的index.php移到和public同级目录下,[或者直接在public同级目录下新建一个index.php] 第二步:那么这个新的index.php文件的内容如下: & ...

  8. Houdini Linux Crack

    安装 破解停止服务 /etc/init.d/sesinetd stop 刪除sesinetd | 拷贝破解文件sesinetd | 修改sesinetd的权限(读写权限) cd /usr/lib/se ...

  9. 浅谈SVG(可缩放的矢量图形)

    前一段项目中用到了svg图片就和其他的元素一样 直接引用就可以展示在页面上,因为项目紧张没有仔细的研究,最近在扩展自己的基础知识,偶然看到了这个东西,于是总结了一些博客园中关于这个svg的基础知识,只 ...

  10. Java 面向对象之构造方法

    01构造方法引入 A:构造方法的引入 在开发中经常需要在创建对象的同时明确对象的属性值,比如员工入职公司就要明确他的姓名.年龄等属性信息. 那么,创建对象就要明确属性值,那怎么解决呢?也就是在创建对象 ...