P1519 穿越栅栏 Overfencing

    • 69通过
    • 275提交
  • 题目提供者该用户不存在
  • 标签USACO
  • 难度普及/提高-

提交  讨论  题解

最新讨论

  • USACO是100分,洛谷是20分
  • 为什么只有十分

题目描述

描述 农夫John在外面的田野上搭建了一个巨大的用栅栏围成的迷宫。幸运的是,他在迷宫的边界上留出了两段栅栏作为迷宫的出口。更幸运的是,他所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意一点找到一条走出迷宫的路。给定迷宫的宽度W(1<=W<=38)及高度H(1<=H<=100)。 2*H+1行,每行2*W+1的字符以下面给出的格式表示一个迷宫。然后计算从迷宫中最“糟糕”的那一个点走出迷宫所需的步数(就是从最“糟糕”的一点,走出迷宫的最少步数)。(即使从这一点以最优的方式走向最靠近的出口,它仍然需要最多的步数)当然了,牛们只会水平或垂直地在X或Y轴上移动,他们从来不走对角线。每移动到一个新的方格算作一步(包括移出迷宫的那一步)这是一个W=5,H=3的迷宫:

+-+-+-+-+-+

| |

+-+ +-+ + +

| | | |

  • +-+-+ + +

| | |

+-+ +-+-+-+

(请将上图复制到记事本观看更加)

如上图的例子,栅栏的柱子只出现在奇数行或奇数列。每个迷宫只有两个出口。

输入输出格式

输入格式:

第一行: W和H(用空格隔开)

第二行至第2 H + 1行: 每行2 W + 1个字符表示迷宫

输出格式:

输出一个单独的整数,表示能保证牛从迷宫中任意一点走出迷宫的最小步数。

输入输出样例

输入样例#1:

5 3
+-+-+-+-+-+
| |
+-+ +-+ + +
| | | |
+ +-+-+ + +
| | |
+-+ +-+-+-+
输出样例#1:

9

说明

翻译来自NOCOW

USACO 2.4

分析:这道题的输入方式很奇怪啊,为啥非要用+来表示,这样的话,要把走一格变成走两格,总的来说就是BFS.

先把图建出来,如果是空格就赋值为0,在边界处找到两个出口,加入到队列中,然后扩展节点,这样就可以只用从两个点扩展,而不必枚举一大堆点.

要求的点要从最近的出口出来,那么从出口先扩展到的一定是离这个出口更近,访问到的点打上标记,这样就不会被第二个出口扩展的节点覆盖而使答案错误,在扩展节点的时候更新最大值即可.

#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <queue> using namespace std;
int w, h,a[][],vis[][],ans; int ddx[] = { ,-,,, };
int ddy[] = { ,,,-, }; struct node
{
int x, y, step;
}; queue <node> q; int main()
{
scanf("%d%d\n", &w, &h);
w = w * + ;
h = h * + ;
for (int i = ; i <= h; i++)
for (int j = ; j <= w; j++)
a[i][j] = ; for (int i = ; i <= h; i++)
{
char s[];
cin.getline(s, );
for (int j = ; j <= w; j++)
if (s[j - ] != '+' && s[j - ] != '-' && s[j - ] != '|')
a[i][j] = ;
}
/*
for (int i = 1; i <= h; i++)
{
for (int j = 1; j <= w; j++)
printf("%d", a[i][j]);
printf("\n");
}
*/
for (int i = ; i <= h; i++)
for (int j = ; j <= w; j++)
if (i == || j == || i == h || j == w)
if (a[i][j] == )
{
for (int k = ; k <= ; k++)
{
int tx = i + ddx[k], ty = j + ddy[k];
if (a[tx][ty] == && tx >= && tx <= h && ty >= && ty <= w && vis[tx][ty] == )
{
node temp;
temp.x = tx;
temp.y = ty;
temp.step = ;
q.push(temp);
vis[tx][ty] = ;
break;
}
}
}
ans = ;
while (!q.empty())
{
node t = q.front();
q.pop();
for (int k = ; k <= ; k++)
{
int tx = t.x + ddx[k], ty = t.y + ddy[k],tstep = t.step;
if (a[tx][ty] == && tx + ddx[k] <= h && tx + ddx[k] >= && ty + ddy[k] <= w && ty + ddy[k] >= && vis[tx + ddx[k]][ty + ddy[k]] == )
{
node temp;
temp.x = tx + ddx[k];
temp.y = ty + ddy[k];
temp.step = tstep + ;
vis[tx + ddx[k]][ty + ddy[k]] = ;
q.push(temp);
//printf("%d %d %d\n", temp.x, temp.y, temp.step);
if (temp.step > ans)
ans = temp.step;
}
}
}
printf("%d\n", ans); //while (1);
return ;
}

洛谷P1519 穿越栅栏 Overfencing的更多相关文章

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

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

  2. luogu P1519 穿越栅栏 Overfencing

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

  3. 洛谷 P2329 [SCOI2005]栅栏 解题报告

    P2329 [SCOI2005]栅栏 题目描述 农夫约翰打算建立一个栅栏将他的牧场给围起来,因此他需要一些特定规格的木材.于是农夫约翰到木材店购买木材.可是木材店老板说他这里只剩下少部分大规格的木板了 ...

  4. 洛谷 P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm

    题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定奶牛必须遵 ...

  5. 洛谷 P3659 [USACO17FEB]Why Did the Cow Cross the Road I G

    //神题目(题目一开始就理解错了)... 题目描述 Why did the cow cross the road? Well, one reason is that Farmer John's far ...

  6. 缩点【洛谷P2921】 [USACO08DEC]在农场万圣节Trick or Treat on the Farm

    [洛谷P2921] [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N< ...

  7. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  8. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  9. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

随机推荐

  1. js工具类 ----正则

    function(value){  if(value){   var reg=new RegExp("^[a-zA-Z0-9_-]+$");   return reg.test(v ...

  2. 第二次正式java web开发项目的总结(回收站恢复)

    都说互联网行业加班很是厉害,记得前不久网上还晒出了几个大城市互联网行业的加班排名调查,但是我们公司,或者说我们项目组倒是非常的例外,进公司也差不多半年了,才仅仅上个月有一个周六加过一天班而已. 不过好 ...

  3. 黄聪:VPS实现自动定时备份网站数据以及Mysql数据库到百度云同步盘

    建站多了,备份成了头疼的问题,因为你不知道你的VPS什么时候会宕机或者服务商跑路,一旦网站数据丢失,那么相当于前功尽弃了,所以自己研究出了一套自动备份的方法. 需要的东西: 1.一个VPS(虚拟空间没 ...

  4. python (1)一个简单的爬虫: python 在windows下 创建文件夹并写入文件

    1.一个简单的爬虫:爬取豆瓣的热门电影的信息 写在前面:如何创建本来存在的文件夹并写入 t_path = "d:/py/inn" #本来不存在inn,先定义路径,然后如果不存在,则 ...

  5. 图片_ _图片缓存之内存缓存技术LruCache,软引用

    每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常,这个问题曾经让我觉得很烦恼,后来终于得到了解决,那么现在就让我和大家一起分享一下吧.这篇博文要讲的图片缓存机制,我接触到的有两钟,一 ...

  6. eclipse中输入@符号自动提示Annotation

    将Eclipse中Content Assist中的Auto activation for java里.的后面加上@符号即可

  7. laravel项目return back()->withErrors($validator)或return back()->with('errors','原密码错误!')在前台原密码错误的情况下不能正确显示错误信息,变成报错!

    被折磨的答案是 php artisan --version看一下版本,如果是5.2.26以上的,在路由处删除web中间件分组,还有问题再反馈

  8. 如何利用jQuery进行简单表单验证

    <!DOCTYPE html><html><head><meta charset="utf-8"><meta name=&qu ...

  9. git相关网页

    git.apache2.gerrit安装 1.http://blog.csdn.net/benkaoya/article/details/8680886 2.http://fatalove.iteye ...

  10. Python深入02 上下文管理器

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 上下文管理器(context manager)是Python2.5开始支持的一种语 ...