【USACO 2.4.2】穿越栅栏
【描述】
农夫John在外面的田野上搭建了一个巨大的用栅栏围成的迷宫。幸运的是,他在迷宫的边界上留出了两段栅栏作为迷宫的出口。更幸运的是,他所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意一点找到一条走出迷宫的路。给定迷宫的宽度W(1<=W<=38)及高度H(1<=H<=100)。 2*H+1行,每行2*W+1的字符以下面给出的格式表示一个迷宫。然后计算从迷宫中最“糟糕”的那一个点走出迷宫所需的步数(就是从最“糟糕”的一点,走出迷宫的最少步数)。(即使从这一点以最优的方式走向最靠近的出口,它仍然需要最多的步数)当然了,牛们只会水平或垂直地在X或Y轴上移动,他们从来不走对角线。每移动到一个新的方格算作一步(包括移出迷宫的那一步)这是一个W=5,H=3的迷宫:
- +-+-+-+-+-+
- | |
- +-+ +-+ + +
- | | | |
- + +-+-+ + +
- | | |
- +-+ +-+-+-+
如上图的例子,栅栏的柱子只出现在奇数行或奇数列。每个迷宫只有两个出口。
【格式】
PROGRAM NAME: maze1
INPUT FORMAT:
(file maze1.in)
- 第一行: W和H(用空格隔开)
- 第二行至第2 * H + 1行: 每行2 * W + 1个字符表示迷宫
OUTPUT FORMAT:
(file maze1.out)
- 输出一个单独的整数,表示能保证牛从迷宫中任意一点走出迷宫的最小步数。
【分析】
直接上BFS了。
- #include <iostream>
- #include <cstdio>
- #include <cmath>
- #include <algorithm>
- #include <cstring>
- #include <queue>
- const int maxh=;
- const int INF=;
- using namespace std;
- struct node
- {
- int x,y;//坐标
- int step;//步数
- }Exit[];
- int map[maxh][maxh],w,h;
- int dx[]={,-,,},dy[]={,,,-};//方向
- int low[maxh][maxh];
- void init();
- void bfs(int num);//出口编号
- int main()
- {
- //文件操作
- freopen("maze1.in","r",stdin);
- freopen("maze1.out","w",stdout);
- init();
- //printf("%d %d\n",Exit[0].x,Exit[0].y);
- //printf("%d %d",Exit[1].x,Exit[1].y);
- bfs();bfs();//分别从两个出口广搜
- int ans=;
- for (int i=;i<=*h+;i++)
- for (int j=;j<=*w+;j++)
- if (low[i][j]!=INF) ans=max(ans,low[i][j]);
- printf("%d",ans);
- return ;
- }
- void init()
- {
- int point=,i,j;
- memset(map,,sizeof(map));
- memset(low,,sizeof(low));
- scanf("%d%d",&w,&h);
- for (i=;i<=*h+;i++)
- {
- getchar();//去除换行符
- for (j=;j<=*w+;j++)
- {
- char temp;
- scanf("%c",&temp);
- map[i][j]=;
- low[i][j]=INF;//初始化
- //找出口
- if ((i== || i==(*h+) || j== || j==(*w+)) && map[i][j]==)
- {
- Exit[point].x=i;if (i==) Exit[point].x++;else if (i==*h+) Exit[point].x--;
- Exit[point].y=j;if (j==) Exit[point].y++;else if (j==*w+) Exit[point].y--;
- Exit[point++].step=;
- }
- }
- }
- }
- void bfs(int num)
- {
- int i;
- queue<node>Q;
- while (!Q.empty()) Q.pop();
- Q.push(Exit[num]);
- low[Exit[num].x][Exit[num].y]=;
- while (!Q.empty())
- {
- node u=Q.front();Q.pop();
- for (i=;i<;i++)
- {
- node v;
- v.x=u.x+dx[i];v.y=u.y+dy[i];
- v.step=u.step+;
- if (map[v.x][v.y]==) continue;
- v.x+=dx[i];v.y+=dy[i];//跨步
- if (v.step<low[v.x][v.y])
- {
- low[v.x][v.y]=v.step;
- Q.push(v);
- }
- }
- }
- }
【USACO 2.4.2】穿越栅栏的更多相关文章
- 洛谷P1519 穿越栅栏 Overfencing
P1519 穿越栅栏 Overfencing 69通过 275提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交 讨论 题解 最新讨论 USACO是100分,洛谷是20分 为什么 ...
- 【刷题】洛谷 P1519 穿越栅栏 Overfencing
题目描述 描述 农夫John在外面的田野上搭建了一个巨大的用栅栏围成的迷宫.幸运的是,他在迷宫的边界上留出了两段栅栏作为迷宫的出口.更幸运的是,他所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意 ...
- luogu P1519 穿越栅栏 Overfencing
题目描述 描述 农夫John在外面的田野上搭建了一个巨大的用栅栏围成的迷宫.幸运的是,他在迷宫的边界上留出了两段栅栏作为迷宫的出口.更幸运的是,他所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意 ...
- USACO 4.1.2 栅栏的木料
这个讲的超好....一定要看...然后看我代码就好懂啦... http://blog.csdn.net/ta201314/article/details/41287567 各种优化确实非常好....搜 ...
- [USACO 3.3.1]骑马修栅栏t
[USACO 3.3.1]骑马修栅栏 时间限制: 1 Sec 内存限制: 64 MB提交: 39 解决: 17[提交][状态][讨论版] 题目描述 农民John每年有很多栅栏要修理.他总是骑着马穿 ...
- 「USACO」「LuoguP2731」 骑马修栅栏 Riding the Fences(欧拉路径
Description Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编 ...
- USACO Section 3.3 骑马修栅栏 Riding the Fences
题目背景 Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. 题目描述 John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个 ...
- 【USACO 3.3.1】骑马修栅栏
[描述] Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个程序,读入 ...
- USACO 3.3.1 Riding the Fences 骑马修栅栏(欧拉回路)
Description 农民John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个一个栅栏.你必须编一个程 ...
随机推荐
- Java实现二叉树的构建与遍历
转载:http://ocaicai.iteye.com/blog/1047397 目录: 1.把一个数组的值赋值给一颗二叉树 2.具体代码 1.树的构建方法 2.具体代码 package tree; ...
- java学习之语句结构
在java语言当中存在4中语句结构,分别是: 1.顺序结构 2.判断结构 3.选择结构 4.循环结构 一.顺序结构: 所谓的顺序结构,也就是当不指定其他三种语句结构的情况下,语句是从上往下依次执行的, ...
- vijos1082丛林探险
P1082丛林探险 描述 东非大裂谷中有一片神秘的丛林,是全世界探险家的乐园,著名黄皮肤探险家BB一直想去试试.正好我国科学家2005年4月将首次对东非大裂谷进行科考,BB决定随科考队去神秘丛林探险. ...
- module_init和init_module的区别
今天在看CS8900的驱动时,发现其驱动的模块加载函数是init_module(),由于看到大多数的驱动用的模块加载函数大多是module_init()函数,所以一时没缓过神来,总是在找CS8900的 ...
- (转载)PHP去掉转义后字符串中的反斜杠\函数stripslashes
(转载)http://www.beijibear.com/index.php?aid=182 addslashes()函数主要是在字符串中添加反斜杠对特殊字符进行转义,stripslashes()则是 ...
- 【动态规划】【二分】【最长上升子序列】Vijos P1028 魔族密码
题目链接: https://vijos.org/p/1028 题目大意: 给N个字符串(N<=2000),求能组成词链的单词最多有几个. 如果在一个由一个词或多个词组成的表中,除了最后一个以外, ...
- C++引用变量学习
版权所有,转载请注明来源 (1)reference variable(rv) 主要用处是作为方程的形式参数,使用rv 可以直接对原数据进行操作而不是该数据的拷贝,节省了时间和空间,尤其是对于结构体以及 ...
- motan源码分析十:流量切换
motan提供了流量切换的功能,可以实现把一个group的流量切换到另一个group(一个或多个服务都可以).大家可以使用tomcat部署motan的管理工具,并设置几个组,例如可以参考demo代码: ...
- 使用Xcode8的Instruments检测解决iOS内存泄露(leak)
在苹果没有出ARC(自动内存管理机制)时,我们几乎有一半的开发时间都耗费在这么管理内存上.后来苹果很人性的出了ARC,虽然在很大程度上,帮助我们开发者节省了精力和时间.但是我们在开发过程中,由于种种原 ...
- 关于Form窗体的StartPosition 属性如何设置的问题
1.让窗体在启动时在指定位置出现 form1.StartPosition Manual CenterScreen WindowsDefaultLocation (default) WindowsDef ...