题目描述

描述 农夫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

刚读完题,感觉挺简单啊,不过研究了一下样例,一脸懵逼,这咋可能?。

经过机房某位 S型 dalao(son)的解读,哦,so ga si nei,吆西吆西,interisting!!!

再次就借花献佛了。

关于的理解题意:

为了便于理解,这里稍微修改一下题目。

奇数行的栅栏(就是由‘+’和‘-’号组成)将其看做一层类似膜结构,一层防护膜(没有厚度),穿越不占距离。

然后看偶数列,这里需要将偶数列和其两侧的‘-’看做一个整体,亦可以理解为忽略偶数列,只考虑奇数列。

这里拿样例图解:

结合上图,对题意理解就没什么问题了。

解题剖析:

1.读入含空格矩阵:

想了半天,试了多种输入方法,最终貌似只有getline(:不会用戳我啊)可以用。

但是在输入时,需要多输入一行,并且第一行和第二行会重复,其他没毛病,最后貌似没啥大碍。

    scanf("%d%d",&w,&h);w=w*2+1;h=h*2+1;for(int i=1;i<=h+1;i++)getline(cin,a[i]);

读入是这样的,若有某位dalao明白以上出现的情况,希望讨论区不吝赐教。

2.字符矩阵转换数字矩阵

在这里定义一个int型map数组。

map[i][j]表示走到这个点需要消耗的距离(偶数行为0,奇数行有空地的话消耗为1)

在字符矩阵中[i][j]这个点为栅栏,不能走,将map[i][j]定义为2.

注意前边说到,输入字符时会有一行多余,所以在转换时处理一下。

此部分代码为:

    for(int i=2;i<=h+1;i++)for(int j=0;j<w;j++){if(a[i][j]==32){if((i-1)%2==1)map[i-1][j+1]=0;else if((j+1)%2==0)map[i-1][j+1]=1;else map[i-1][j+1]=0;}else map[i-1][j+1]=2;}

3.初始化:

ans[i][j]数组记录走到 i,j这个点到出口的最近距离,栅栏处直接定义为-1。

void initial()
{for(int i=1;i<=h;i++)for(int j=1;j<=w;j++)if(map[i][j]==2)ans[i][j]=-1;else ans[i][j]=214748364;
}

4.找出出口:

这没啥好说的,四个边找出口(注意经以上过程出口可能为0,可能为1)。

    for(int i=1;i<=w;i++)if(map[1][i]==0||map[1][i]==1)bfs(1,i);for(int i=1;i<=w;i++)if(map[h][i]==0||map[h][i]==1)bfs(h,i);for(int i=1;i<=h;i++)if(map[i][1]==0||map[i][1]==1)bfs(i,1);for(int i=1;i<=h;i++)if(map[i][w]==0||map[i][w]==1)bfs(i,w);

5.大搜索

已经处理处每一格的消耗距离,在搜索时,加上就好啦。

两个出口,需要搜索两边所以搜完注意初始化,bool型数组。

bool vis[N][M];
struct ahah{int x,y;
}str,cur;
queue <ahah> que;
void bfs(int x,int y)
{ans[x][y]=0;vis[x][y]=1;str.x=x;str.y=y;que.push(str);while(!que.empty()){cur=que.front();que.pop() ;for(int i=0;i<4;i++){str.x=cur.x+dx[i];str.y=cur.y+dy[i];if(map[str.x][str.y]!=2&&str.x>=1&&str.x<=h&&str.y>=1&&str.y<=w&&!vis[str.x][str.y]){ans[str.x][str.y]=min(ans[cur.x][cur.y]+map[str.x][str.y],ans[str.x][str.y]);vis[str.x][str.y]=1;que.push(str); }}} memset(vis,0,sizeof(vis));
}

6.找出最大值

将ans数组循环一遍,找出最大值,输出即可。

完整代码:

/*.........................
作者:Manjusaka
时间:2018/7/11
题目:P1519 Overfencing
..........................*/#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
#define N int(100)
#define M int(210)
int dx[5]={0,0,1,-1},dy[5]={1,-1,0,0};
string a[N];
int w,h,MAX;
int x[4],y[4],k;
int map[N][M];
int ans[N][M];
void check();
void _scanf();
void initial();
void bfs(int ,int );
void _scanf()
{scanf("%d%d",&w,&h);w=w*2+1;h=h*2+1;for(int i=1;i<=h+1;i++)getline(cin,a[i]);for(int i=2;i<=h+1;i++)for(int j=0;j<w;j++){if(a[i][j]==32){if((i-1)%2==1)map[i-1][j+1]=0;else if((j+1)%2==0)map[i-1][j+1]=1;else map[i-1][j+1]=0;}else map[i-1][j+1]=2;}
//    cout<<"\n";for(int i=1;i<=h;i++){for(int j=1;j<=w;j++){cout<<map[i][j];}cout<<endl;}
    check();
}
void check()
{initial();    for(int i=1;i<=w;i++)if(map[1][i]==0||map[1][i]==1)bfs(1,i);for(int i=1;i<=w;i++)if(map[h][i]==0||map[h][i]==1)bfs(h,i);for(int i=1;i<=h;i++)if(map[i][1]==0||map[i][1]==1)bfs(i,1);for(int i=1;i<=h;i++)if(map[i][w]==0||map[i][w]==1)bfs(i,w);for(int i=1;i<=h;i++){cout<<"\n";for(int j=1;j<=w;j++){printf("%3d",ans[i][j]);}}
}
void initial()
{for(int i=1;i<=h;i++)for(int j=1;j<=w;j++)if(map[i][j]==2)ans[i][j]=-1;else ans[i][j]=214748364;
}
bool vis[N][M];
struct ahah{int x,y;
}str,cur;
queue <ahah> que;
void bfs(int x,int y)
{ans[x][y]=0;vis[x][y]=1;str.x=x;str.y=y;que.push(str);while(!que.empty()){cur=que.front();que.pop() ;for(int i=0;i<4;i++){str.x=cur.x+dx[i];str.y=cur.y+dy[i];if(map[str.x][str.y]!=2&&str.x>=1&&str.x<=h&&str.y>=1&&str.y<=w&&!vis[str.x][str.y]){ans[str.x][str.y]=min(ans[cur.x][cur.y]+map[str.x][str.y],ans[str.x][str.y]);vis[str.x][str.y]=1;que.push(str); }}} memset(vis,0,sizeof(vis));
}
void _printf()
{for(int i=1;i<=h;i++)for(int j=1;j<=w;j++)MAX=max(MAX,ans[i][j]);printf("\n%d",MAX);
}
int main()
{_scanf();_printf();
}

求助大佬!!:

按题目要求来说二位数组开到100*200应该完全可以啊,为什么会比RE,求解释。

转载于:https://www.cnblogs.com/rmy020718/p/9297006.html

luogu P1519 穿越栅栏 Overfencing相关推荐

  1. 穿越栅栏 Overfencing

    https://www.luogu.org/problemnew/show/P1519 题解:二进制状态压缩+BFS 注意:洛谷上数据以'\r\n'结尾,并非'\n' /* *@Author: STZ ...

  2. usaco Overfencing 穿越栅栏(BFS)

    Overfencing 穿越栅栏 农夫 John 在外面的田野上搭建了一个巨大的用栅栏围成的迷宫.幸运的是,他在迷宫的边界上留出 了两段栅栏作为迷宫的出口.更幸运的是,他所建造的迷宫是一个" ...

  3. USACO2.4のP1519-穿越栅栏(Overfencing)【bfs】

    正题 题目大意 一个迷宫,有许多出口,求一个点到最近的出口最远. 解题思路 直接bfs暴力搜索,然后保存上次的答案 code // luogu-judger-enable-o2 #include< ...

  4. 洛谷P2181答案C语言,洛谷P2181 对角线(组合数)

    题目描述 对于一个N个定点的凸多边形,他的任何三条对角线都不会交于一点.请求楚图形中对角线交点的个数. 例如,6边形: 输入输出格式 输入格式: 第一行一个n,代表边数. 输出格式: 第一行输出交点数 ...

  5. 【读书】马克·李维《自由的孩子》摘录

    没有任何的牢笼可禁锢我的思想,所有的情愫都可以穿越栅栏飞向远方. --马克·李维 <自由的孩子> 这是马克·李维的<自由的孩子>中让我感触最深的话,这场青春的挽歌,关乎友情.关 ...

  6. 《the cave》攻略及感悟

    <the cave>这款游戏是一个智力解谜游戏,寒假太无聊,又不想刷题,于是把这个游戏给通关了,哈哈. 我玩的是汉化版的,里面的英语基本上不到1/3吧,贴个链接吧:<the cave ...

  7. [Luogu 5465] [LOJ 6435] [PKUSC2018]星际穿越(倍增)

    [Luogu 5465] [LOJ 6435] [PKUSC2018]星际穿越(倍增) 题面 n个点的图,点i和[l[i],i)的所有点连双向边.每次询问(l,r,x)表示x到[l,r]的所有点的最短 ...

  8. 【续集】宫锁心玉第2部【一】『再度穿越』(欢迎转载分享)

    传说在历史上有一种颠倒空间的现象九星连珠,人们称这种现象叫做穿越.然而在2011年,历史上出现了反穿越第一人--爱新觉罗•胤禩.当他穿越到这个世界后,他找到了他最重要的人--洛晴川. 晴川:你--是怎 ...

  9. SW练习_栅栏2_unionfind_凸包

    连接重新挂载的部分可以优化 package com.company.real; import java.io.BufferedReader; import java.io.FileInputStrea ...

最新文章

  1. 想从事分布式系统,计算,hadoop等方面,需要哪些基础,推荐哪些书籍?--转自知乎...
  2. Java基础知识复习(一)
  3. RequestBody获取前端数据_360视频云Web前端HEVC播放器实践剖析
  4. 【洛谷2926/BZOJ1607】[USACO08DEC]Patting Heads拍头(筛法)
  5. 特征提取与检测(五) : LBP特征
  6. 日志分析里面的max是什么_mysql慢日志文件分析处理
  7. 使用ActivityGroup类显示多个Activity
  8. Maven无法加载ojdbc14.jar的解决方法
  9. FFMPEG:MP4封装格式中外挂字幕的提取
  10. 以太坊(ethereum)开发DApp应用的入门区块链技术教程
  11. 【数据结构--二叉树】--附超详细图解
  12. .9图片处理报错Error: java.lang.RuntimeException: Crunching Cruncher ic_coupon2.9.png failed, see logs
  13. Android Studio报错提示:Excepted resource of type color
  14. 学习记录-- 用 Latex 修改文字/段落颜色 用于回复审稿意见。
  15. 校园网登录界面打不开,远程计算机或设备不接受链连接
  16. [DR吐槽]——三大卡牌链游到底都是什么货色?
  17. centos yum配置文件 .repo文件解释
  18. PDF怎么批量转换成TXT格式?
  19. Python代码实现Excel转JSON
  20. 2015武汉大学第八届Eming杯现场赛E题题解

热门文章

  1. ftp限流java,FTP流量限制的方法
  2. python中的range_python中range()与xrange()用法分析
  3. sql安装联机丛书提示发生网络错误_速达软件:安装问题解答
  4. 高斯背景建模 matlab,高斯背景建模整理 – 要饭的
  5. y空间兑换代码_Python爬虫实战:QQ空间全自动点赞工具
  6. C语言中要改变循环语句的流程可以使用的语句有哪些
  7. C/C 代码规范注释有哪些讲究?
  8. 如何使用man命令linux,Linux man命令的使用方法
  9. php拼接多个insert,php – 将多个INSERTS分成一个表和多个表
  10. 未发现oracle(tm)客户端和网络组件_SpringColud Eureka的服务注册与发现