##前言
由于这道题比较难,有不好描述,我就直接贴题目了。

##Description
以一个几乎超乎想像的运气,农民约翰在他的生日收到了一张爱尔兰博彩的奖券。
这一张奖券成为了唯一中奖的奖券。
农民约翰嬴得爱尔兰的乡下地方的一个传说中的城堡。
吹牛在他们威斯康辛州不算什么,农民约翰想告诉他的牛所有有关城堡的事。
他想知道城堡有多少房间,而且最大的房间有多大。
事实上,他想去掉一面墙来制造一个更大的房间。
你的任务是帮助农民约翰去了解正确房间数目和大小。
城堡的平面图被分为 M(wide)*N(1 <=M,N<=50)个小正方形。
每个这样的小正方形有0到4面墙。
城堡在它的外部边缘总是有墙壁的,好遮挡风雨。
考虑这注解了一个城堡的平面图:

例子的城堡的大小是7 x 4。
一个 "房间"是平面图上有连接的"小正方形"的集合。
这个平面图包含五个房间。(它们的大小是9,7,3,1, 和 8 排列没有特别的顺序)。
移除被箭作记号的墙壁来合并两个房间来制造最大的可能房间(移除一面墙所能产生的)。
城堡总是至少有二个房间并且总是有一面墙壁以可能被移除。

###Input
地图以一个表格来储存,每个数字描述一个小正方形,N行每行M个数来描述这个平面图。
输入顺序符合那个在上面例子的编号方式。
每个描述小正方形的数字说明小正方形的四面的墙的分布情况,它是下面4个数的和:
1: 在西面有墙
2: 在北面有墙
4: 在东面有墙
8: 在南面有墙
内部的墙壁是会被定义两次;小正方形(1,1)南面的墙也被指出是小正方形(2,1)北面的墙。
第 1 行: 二个被空格分开的整数: M 和 N
第 2 到 N+1 行: M x N 个整数,每行M个。

###Output
输出包含一些行:
第 1 行: 城堡的房间数目。
第 2 行: 最大的房间的大小
第 3 行: 移除一面墙能得到的最大的房间的大小
第 4 行: 移除哪面墙
选择最佳的墙来移除,(选择最靠西的,如果仍然不能确定,再选择最靠南的。编者注:墙的位置应该由它的中点来定义)
(【原文】Choose the optimal wall to remove from the set of optimal walls by choosing the wall farther to the west (and then, if still tied, farthest to the south).)
墙壁由它在相邻的小正方形的西部或南方来命名
最后一行一定要有回车

###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


##解题思路
用广搜求出前2个值。求出每个小方格的对应的房间的大小,然后枚举一下破坏哪堵墙求最大值。


##代码

#include<cstdio>
#include<iostream>
using namespace std;
const int W=0,N=1,E=2,S=3;//常量
int dx[4]={0,-1,0,1},dy[4]={-1,0,1,0};
//搜索方向
bool a[51][51][4];//记录有没有墙
int head,tail,walk[51][51],ft[2501],mn,maxs,x,n,m;
int state[2501][2],c;
void bfs(int x,int y)
{c++;//标记房间号head=0;tail=1;state[1][0]=x;state[1][1]=y;walk[x][y]=c;//初始化do{head+=1;for (int i=0;i<4;i++) {x=state[head][0]+dx[i];y=state[head][1]+dy[i];int zx,zy;zx=state[head][0];zy=state[head][1];if (walk[x][y]==0 && !a[zx][zy][i] && x<=n && y<=m && x>=1 && y>=1){tail++;state[tail][0]=x;state[tail][1]=y;walk[x][y]=c;//归入当前房间}}}while (head<tail);
}
int main()
{scanf("%d%d",&m,&n); for (int i=1;i<=n;i++)for (int j=1;j<=m;j++){scanf("%d",&x);if (x>=8) {a[i][j][S]=true;a[i+1][j][N]=true;x-=8;}//南墙if (x>=4) {a[i][j][E]=true;a[i][j+1][W]=true;x-=4;}//东墙if (x>=2) {a[i][j][N]=true;a[i-1][j][S]=true;x-=2;}//北墙if (x>=1) {a[i][j][W]=true;a[i][j-1][E]=true;x-=1;}//西墙}   for (int i=1;i<=n;i++)for (int j=1;j<=m;j++)if (!walk[i][j]){mn++;//房间总数bfs(i,j);//搜索maxs=max(maxs,tail);//求最大房间ft[c]=tail;//记录房间大小}printf("%d\n%d\n",mn,maxs);//输出maxs=0;x=0;int y=0;char wall='0';//根据题目要求我们可以得知只有可能破坏N或E墙for (int j=1;j<=m;j++)for (int i=n;i>=1;i--)    {if (i-1>=1 && a[i][j][N] && walk[i][j]!=walk[i-1][j] && ft[walk[i][j]]+ft[walk[i-1][j]]>maxs)//判断如果该方向有墙而且不属于同一个房间{maxs=ft[walk[i][j]]+ft[walk[i-1][j]];x=i;y=j;wall='N';}//同上if (j+1<=m && a[i][j][E] && walk[i][j]!=walk[i][j+1] && ft[walk[i][j]]+ft[walk[i][j+1]]>maxs){maxs=ft[walk[i][j]]+ft[walk[i][j+1]];x=i;y=j;wall='E';}}printf("%d\n%d %d %c",maxs,x,y,wall);
}

ssl1104-USACO 2.1城堡(foodfill)【图论,广搜】相关推荐

  1. 【双端队列广搜/搜索+图论】AcWing 2019.拖拉机 USACO 2012 March Contest Silver Division

    [题目描述] 干了一整天的活,农夫约翰完全忘记了他把拖拉机落在田地中央了. 他的奶牛非常调皮,决定对约翰来场恶作剧. 她们在田地的不同地方放了 NNN 捆干草,这样一来,约翰想要开走拖拉机就必须先移除 ...

  2. 【图论专题】BFS中的双向广搜 和 A-star

    双向广搜 AcWing 190. 字串变换 #include <cstring> #include <iostream> #include <algorithm> ...

  3. 图论 用广搜搜邻接矩阵

    用广搜搜邻接矩阵 只是从某一点开始搜,如果是遍历全图的话就每个顶点挨个搜一遍 #include<stdio.h> #include<string.h> #include< ...

  4. hdu 1253 胜利大逃亡 (广搜)

    题目链接 Problem Description Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个ABC的立方体,可以被表示成A个 ...

  5. 算法学习笔记(六) 二叉树和图遍历—深搜 DFS 与广搜 BFS

    图的深搜与广搜 复习下二叉树.图的深搜与广搜. 从图的遍历说起.图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其 ...

  6. 深搜广搜专题【DFS】【BFS】

    深搜广搜专题 又是一年专题时,这次的专题是BFS和DFS,我们刚加入acm时的噩梦,然而现在已经写起来很舒服了(OS:那你还A不出题?) BFS和DFS都是通过对所有的点进行遍历来得到结果的,是一种比 ...

  7. 蓝桥杯-学霸的迷宫-广搜-java

    算法提高 学霸的迷宫   时间限制:1.0s   内存限制:256.0MB 问题描述 学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗.但学霸为了不要别人打扰,住在一个城堡里,城堡外面 ...

  8. 算法之路——深搜、广搜(简单搜索)

    搜索 通过一定的顺序,枚举每一个数据(经常会通过一些判断条件去掉无意义的数据,即剪枝),找到想要的数据的过程. 深度优先搜索(dfs) 深度优先搜索属于图算法的一种,是一个针对图和树的算法,应为缩写为 ...

  9. poj 3278 Catch That Cow 广搜

    hdu 2717 Catch That Cow,题目链接 Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...

最新文章

  1. 国外同行关注啥——digg.com网站Programming分类每周热点[12/17 - 12/23]
  2. python错误-Python错误处理和异常处理
  3. Android动态加载黑科技 动态创建Activity模式
  4. CTFshow 文件包含 web117
  5. c语言 多线程 参数,如何用C语言实现多线程
  6. ehcache 默认大小_简单的使用ehcache
  7. CSS pointer-events属性的使用
  8. python权限不够cmd安装不了_python环境配置+matplotlib
  9. 34深入理解C指针之---通过字符串传递函数
  10. 当个性化推荐遇上知识图谱.pdf(附下载链接)
  11. ArcEngine在个人地理数据库下创建要素类
  12. 二进制包如何知道go 版本_你有同时使用多版本 Go 语言的需求吗,那就快使用多版本管理利器 GVM 吧!...
  13. 《结对-网页贪吃蛇游戏-需求分析》
  14. android 签名打包 Invalid keystore format
  15. 用什么计算机演奏音乐,用这个你可以用自己的电脑弹奏美妙的音乐.
  16. 谷歌浏览器:下载,插件安装
  17. 数据治理成功要素篇1:数据战略管理
  18. 利用手机传感器测量高度
  19. tiny4412开发板Android篇_3基于tiny4412的Android系统的烧写(SD卡烧写到emmc)
  20. Deliberated Domain Bridging for Domain Adaptive Semantic Segmentation

热门文章

  1. kotlin中mainactivity无法直接调用xml中的控件_使用52North 客户端接口调用OGC WPS服务...
  2. 双路服务器只显示一半内存,双路服务器只显示一半内存
  3. 单片机c语言位运算写法,单片机与嵌入式系统中C语言的位运算小记
  4. leetcode28. 实现 strStr(KMP详解)
  5. 将字符串添加负数_Go语言实现LeetCode算法:8 字符串转整数
  6. nginx 带宽_前端工程师不可不知的Nginx知识
  7. HTML怎么去除数组的重复元素,js去除数组中重复元素并排序
  8. 针对深度学习的GPU芯片选择
  9. MySQL 覆盖索引、最左前缀原则、索引下推
  10. P3978 [TJOI2015]概率论(生成函数)