题目背景:

哈利•波特作为三强争霸赛的第四名选手,历尽艰险闯到了最后一关——迷宫。

现在,迷宫里只剩下哈利和塞德里克了,哈利只有在塞德里克前面拿到奖杯,才能赢得比赛。哈利只要能看到奖杯,就可以用飞来咒拿到它,所以,现在的问题是哈利如何能尽早地看到奖杯。

题目描述:

哈利的视力非常好,他能从迷宫的一端沿直线看到迷宫的另一端(但他只能看八个方向——东北,东,东南,南,西南……),而且跑得非常快,跑一步(向上、下、左、右移动一格)只需要1s。但迷宫是不透光的,而且,要烧掉迷宫的墙也不容易,所以哈利决定绕到一个能够看到奖杯的地方。现在,哈利希望你能帮他确定最短需要多长时间才能拿到奖杯。

输入格式:

第一行为2个数N,M表示迷宫的规模(N为高,M为宽)

接下来是N*M的迷宫,O表示空地,X表示墙。

最后是多对数据,分别是奖杯坐标及哈利的坐标(显然不可能在墙上),每对占一行,0为结束标志。

输出格式:

根据每对数据,计算哈利拿到奖杯的最短时间,每对一行。如果魔法部有意难为选手,用墙将奖杯包围了起来,输出”Poor Harry”。

样例输入:

3 4

OXXO

XXOO

XOOO

3 2 2 4

3 3 1 1

0 0 0 0

样例输出:

1

Poor Harry

说明/提示:

对于30%的数据,有N*M<=100

对于60%的数据,有N*M<=1600

对于100%的数据,有N*m<=16384

AC Code:

#include<bits/stdc++.h>
using namespace std;
#define N 2020
int n,m,sx,sy,ex,ey,head,tail,flag;
char s[N][N];//存入地图
int g[N][N],a[N];//g数组用来枚举奖杯在哪些点可以被看到,a数组是拿到奖杯的时间
bool vis[N][N];//标记数组
int dx[]={0,0,1,-1,-1,-1,1,1};//两个方向数组
int dy[]={1,-1,0,0,-1,1,-1,1};//人可以向4个方向行走,但可以看到周围的8个方向
struct node {int x,y;
}q[N*N];//模拟队列
int main() {scanf("%d %d",&n,&m);for(int i=1;i<=n;i++) {for(int j=1;j<=m;j++) {scanf(" %c",&s[i][j]);//%前面的空格确保地图可以完整输入 if(s[i][j]=='X') {//如果这个点是墙 g[i][j]=-1;//标记为-1 }}}while(~scanf("%d %d %d %d",&ex,&ey,&sx,&sy)) {if(ex==0&&ey==0&&sx==0&&sy==0) {//结束标志 break;}for(int i=1;i<=n;i++) {for(int j=1;j<=m;j++) {if(g[i][j]!=-1) {//如果这个点不是墙 g[i][j]=0;//我们暂且将该点记作0 }}}flag=0;//标记变量 memset(vis,false,sizeof(vis));//清空标记数组 g[ex][ey]=1;//奖杯所在的位置修改为1 for(int i=0;i<8;i++) {//奖杯可以在8个方向被看到 //这里的j没有限制,因为如果某一行或者某一列没有墙,则走到该行(列)自然就可以看到奖杯 for(int j=1;;j++) {int tx=ex+dx[i]*j;int ty=ey+dy[i]*j;if(tx<1||tx>n||ty<1||ty>m||g[tx][ty]==-1) {//越界或者该点是墙 break;//直接退出 }else {g[tx][ty]=1;//把奖杯可以被看到的地方都修改为1 }}}head=tail=1;//队头队尾初始化 vis[sx][sy]=true;//标记人的起点 q[head].x=sx;//入队 q[head].y=sy;tail++;//队尾向后移动一格 while(head<tail) {if(g[q[head].x][q[head].y]==1) {//只要到达了能看到奖杯的地方,就意味着拿到了奖杯 printf("%d\n",a[head]);//输出花费的时间 flag=1;//修改标记变量 break;}for(int i=0;i<4;i++) {//人只能向上下左右4个方向移动 int nx=q[head].x+dx[i];int ny=q[head].y+dy[i];//不越界,这个点没有走过,且这个点也不是墙 if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&vis[nx][ny]==false&&g[nx][ny]!=-1) {vis[nx][ny]=true;//标记这个点 q[tail].x=nx;//该点入队 q[tail].y=ny;a[tail]=a[head]+1;//时间+1 tail++;//队尾相应的向后移动一格 }}head++;//队头向后移动一格,继续搜索下一个点 }if(!flag) {//如果看不到奖杯 printf("Poor Harry\n");}}return 0;
}

洛谷P2199-最后的迷宫(BFS)相关推荐

  1. 洛谷 1144 最短路计数 bfs

    洛谷1144 最短路计数 传送门 其实这道题目的正解应该是spfa里面加一些处理,,然而,,然而,,既然它是无权图,,那么就直接bfs了,用一个cnt记录一下每一个点的方案数,分几种情况讨论一下转移, ...

  2. 洛谷 - P4011 孤岛营救问题(bfs+状态压缩)

    题目链接:点击查看 题目大意:给出一个n*m的迷宫,其中有一些边为不可逾越的墙,有一些边为不同型号的门,而钥匙会分布在迷宫的不同位置,求从点(1,1)到点(n,m)的最短时间 题目分析:出现在网络流里 ...

  3. 洛谷 1363【幻想迷宫】

    (其实我不知道算原创还是转载) 题目大意: 现有一个无限大的迷宫,是由无限个n*m的相同矩阵单位组成的,迷宫中有路和墙.给出这个矩阵单位和起点,问能不能走到离起点无穷远的地方. 这题题目还是看懂了,但 ...

  4. 【洛谷】P1363 幻象迷宫

    幻象迷宫可以认为是无限大的,不过它由若干个N*M的矩阵重复组成.矩阵中有的地方是道路,用'.'表示:有的地方是墙,用'#'表示.LHX和WD所在的位置用'S'表示.也就是对于迷宫中的一个点(x,y), ...

  5. 洛谷:P1331 海战(BFS)

    题目描述 在峰会期间,武装部队得处于高度戒备.警察将监视每一条大街,军队将保卫建筑物,领空将布满了F-2003飞机.此外,巡洋船只和舰队将被派去保护海岸线.不幸的是因为种种原因,国防海军部仅有很少的几 ...

  6. 洛谷P1332 血色先锋队(BFS多起点)

    题目背景 巫妖王的天灾军团终于卷土重来,血色十字军组织了一支先锋军前往诺森德大陆对抗天灾军团,以及一切沾有亡灵气息的生物.孤立于联盟和部落的血色先锋军很快就遭到了天灾军团的重重包围,现在他们将主力只好 ...

  7. bfs:01迷宫(洛谷P1141)

    洛谷传送门 解析 乍一看:bfs板子题 冰法师最棒了 然鹅 看了一眼数据范围 心中已有画面 <面 堂 发 黑> 怎么办嘞? 我们想到: 因为该题来与去的可逆性 我们搜一次后,这些点以后都不 ...

  8. 二分+BFS——刺杀大使(洛谷 P1902)

    题目选自洛谷P1902 我们在题面中看到了最大值最小 这五个字. 很容易就想到了二分答案. 同时题目涉及图,以及只能从四个方向,所以想到了BFS的解法 将这两种方法一起使用,就得到了答案! 题目描述 ...

  9. 深度优先搜索——迷宫(洛谷 P1605)

    题目选自洛谷P1605 题目是非常经典以及简单的DFS题目 这里给出模板 int dfs(int t) {if(满足输出条件){输出解;}for(int i=1;i<=尝试方法数;i++)if( ...

最新文章

  1. Linux静态IP设置
  2. Elasticsearch 冷热集群架构实战
  3. 图像降噪算法——非局部均值降噪算法
  4. js数组的map方法以及parseInt方法
  5. 论接单报价管理与ERP信息化管理的重要性
  6. 电子增稳云台_揭秘Dobby自拍无人机,电子增稳是黑科技?
  7. 题解-ZeroJudge-c686 高斯符號
  8. 最为奇怪的程序语言的特性
  9. mysql与oracle语法区别
  10. python操作word文档
  11. 真没想到,vmware进入 bios设置 的方法是这样的
  12. 机器人视觉测量与控制
  13. AHCI sata设备初始化流程
  14. 电脑dns服务器未响应啥意思,电脑诊断出DNS服务器未响应是什么意思
  15. fbi测试_FBI的完整形式是什么?
  16. 未转变者rust服务器推荐,你能在这些最佳生存游戏中活多久?
  17. Sklearn-GBDT(GradientBoostingDecisonTree)梯度提升树
  18. 全网最详细的 Maven 教程!
  19. t检验该怎么分析?如果选择哪种t检验?
  20. linux 磁盘空间查询

热门文章

  1. Android Studio 自带模拟器解决输入中文问题_安装x86的搜狗输入法的APK
  2. 使用bookdown构建新年日记本
  3. nRF2401A无线传输模块介绍
  4. 计算机与电视连接方式是什么,电脑连接电视的方法
  5. 28岁程序员,赚“1个亿”退休:运气,也是实力的一部分
  6. Excel2007版的常用功能(23):PPT图表链接与动画
  7. 详解hadoop之二:HDFS Federation(联邦)
  8. joinquant 策略
  9. postgresql CREATE TABLE
  10. 无符号 byte java_java byte的无符号表示