【描述】

农夫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】穿越栅栏的更多相关文章

  1. 洛谷P1519 穿越栅栏 Overfencing

    P1519 穿越栅栏 Overfencing 69通过 275提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交  讨论  题解 最新讨论 USACO是100分,洛谷是20分 为什么 ...

  2. 【刷题】洛谷 P1519 穿越栅栏 Overfencing

    题目描述 描述 农夫John在外面的田野上搭建了一个巨大的用栅栏围成的迷宫.幸运的是,他在迷宫的边界上留出了两段栅栏作为迷宫的出口.更幸运的是,他所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意 ...

  3. luogu P1519 穿越栅栏 Overfencing

    题目描述 描述 农夫John在外面的田野上搭建了一个巨大的用栅栏围成的迷宫.幸运的是,他在迷宫的边界上留出了两段栅栏作为迷宫的出口.更幸运的是,他所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意 ...

  4. USACO 4.1.2 栅栏的木料

    这个讲的超好....一定要看...然后看我代码就好懂啦... http://blog.csdn.net/ta201314/article/details/41287567 各种优化确实非常好....搜 ...

  5. [USACO 3.3.1]骑马修栅栏t

    [USACO 3.3.1]骑马修栅栏 时间限制: 1 Sec  内存限制: 64 MB提交: 39  解决: 17[提交][状态][讨论版] 题目描述 农民John每年有很多栅栏要修理.他总是骑着马穿 ...

  6. 「USACO」「LuoguP2731」 骑马修栅栏 Riding the Fences(欧拉路径

    Description Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编 ...

  7. USACO Section 3.3 骑马修栅栏 Riding the Fences

    题目背景 Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. 题目描述 John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个 ...

  8. 【USACO 3.3.1】骑马修栅栏

    [描述] Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个程序,读入 ...

  9. USACO 3.3.1 Riding the Fences 骑马修栅栏(欧拉回路)

    Description 农民John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个一个栅栏.你必须编一个程 ...

随机推荐

  1. 【HDOJ】2371 Decode the Strings

    快速矩阵乘法.注意,原始字符串即为decode后的字符串.题目是要找到原始串. #include <cstdio> #include <cstring> #define MAX ...

  2. 2015 BJOI 0102 Secret

    传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=477 试题描述: 在 MagicLand 这片神奇的大陆上,有样一个古老传说 ...

  3. 【无源汇上下界最大流】SGU 194 Reactor Cooling

    题目链接: http://acm.sgu.ru/problem.php?contest=0&problem=194 题目大意: n个点(n<20000!!!不是200!!!RE了无数次) ...

  4. T-SQL 控制流语句

    批处理: 一个批处理段是由一个或者多个语句组成的一个批处理,之所以叫批处理是因为所有语句一次性被提交到一个SQL实例. 批处理是分批提交到SQL Server示例,因此在不同的批处理里局部变量不可访问 ...

  5. Pet

    Problem Description One day, Lin Ji wake up in the morning and found that his pethamster escaped. He ...

  6. BFS zoj 1649

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1649 //hnldyhy(303882171) 11:12:46 // z ...

  7. Using Apache Web Server with Jboss AS 7

    In real-world projects, it's common to find Apache web server as a front door to your application se ...

  8. [转] 关于C++中模板中的typename和class的区别比较

    C++箴言:理解typename的两个含义 转自http://blog.csdn.net/dick_china/article/details/4522253 问题:在下面的 template dec ...

  9. Apache-Tika解析JPEG文档

    通常在使用爬虫时,爬取到网上的文章都是各式各样的格式处理起来比较麻烦,这里我们使用Apache-Tika来处理JPEG格式的图片,如下: package com.mengyao.tika.app; i ...

  10. poj1017

    一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个型号,他们的长宽分别为1*1, 2*2, 3*3, 4*4, 5*5, 6*6.这些产品通常使用一个 6*6*h 的长方体包 ...