Description

这是一个关于二维迷宫的题目。我们要从迷宫的起点 ′S′'S'′S′ 走到终点$ ‘E’$,每一步我们只能选择上下左右四个方向中的一个前进一格。 ′W′'W'′W′ 代表墙壁,是不能进入的位置,除了墙壁以外的地方都可以走。迷宫内的$ ‘D’$ 代表一道上锁的门,只有在持有钥匙的时候才能进入。而 ′K′'K'′K′ 则代表了钥匙,只要进入这一格,就会自动地拿到钥匙。最后 ′.′'.'′.′ 则是代表空无一物的地方,欢迎自在的游荡。

本题的迷宫中,起点、终点、门跟钥匙这四个特殊物件,每一个恰好会出现一次。而且,此迷宫的四周 (最上面的一行、最下面的一行、最左边的一列以及最右边的一列) 都会是墙壁。

请问,从起点到终点,最少要走几步呢?

Input

输入的第一行有两个正整数H, W,分别代表迷宫的长跟宽。

接下来的H行代表迷宫,每行有一个长度恰为W的字串,此字串只包含′S′,′E′,′W′,′D′,′K′,′.′'S', 'E', 'W', 'D ', 'K', '.'′S′,′E′,′W′,′D′,′K′,′.′这几种字元。

(4≤H,W≤500)(4\le H,W\le 500)(4≤H,W≤500)

Output

请在一行中输出一个整数代表答案,如果无法从起点走到终点,请输出−1-1−1。

Sample Input

4 12
WWWWWWWWWWWW
WE.W.S…W.KW
W…D…W…W
WWWWWWWWWWWW

Sample Output

20

Solution

要么解锁要么不解锁,不解锁的直接从SSS开始bfsbfsbfs求到EEE点的最短距离,解锁的第一部分是SSS到KKK的最短距离,第二部分是KKK到EEE的最短距离,两种方案取较优值即可

Code

#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
typedef pair<int,int>P;
const int INF=0x3f3f3f3f,maxn=505;
int n,m,dis[maxn][maxn];
char s[maxn][maxn];
P S,E,K,D;
int dx[]={-1,1,0,0};
int dy[]={0,0,1,-1};
void bfs(P S)
{queue<P>que;que.push(S);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)dis[i][j]=INF; dis[S.first][S.second]=0;while(!que.empty()){P now=que.front();que.pop();int x=now.first,y=now.second;for(int i=0;i<4;i++){int xx=x+dx[i],yy=y+dy[i];if(xx<1||xx>n||yy<1||yy>m||s[xx][yy]!='.'||dis[xx][yy]!=INF)continue;dis[xx][yy]=dis[x][y]+1;que.push(P(xx,yy));}}
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%s",s[i]+1);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(s[i][j]=='S')S=P(i,j);else if(s[i][j]=='E')E=P(i,j);else if(s[i][j]=='K')K=P(i,j);else if(s[i][j]=='D')D=P(i,j);s[S.first][S.second]=s[E.first][E.second]=s[K.first][K.second]='.';bfs(S);int ans1=dis[E.first][E.second],ans2=dis[K.first][K.second];s[D.first][D.second]='.';bfs(K);ans1=min(ans1,ans2+dis[E.first][E.second]);if(ans1==INF)printf("-1\n");else printf("%d\n",ans1);return 0;
}

Newcoder 68 B.迷宫(bfs)相关推荐

  1. 献给阿尔吉侬的花束(二刷,迷宫bfs,模板题)

    文章目录 Question Ideas Code Question 阿尔吉侬是一只聪明又慵懒的小白鼠,它最擅长的就是走各种各样的迷宫. 今天它要挑战一个非常大的迷宫,研究员们为了鼓励阿尔吉侬尽快到达终 ...

  2. 【动态规划】机器人走迷宫-BFS

    机器人走迷宫-BFS 题目描述:给一个矩阵,0代表可走位置,1代表障碍物 给定起点和终点和行走规则(上.下.左.右),输出最短路径 探寻最短路径-BFS 首先定义两个辅助函数,valid_action ...

  3. 蓝桥杯 python 走迷宫 BFS

    蓝桥杯 python 走迷宫 BFS 题目描述 给定一个 N × × × M 的网格迷宫 G.GG的每个格子要么是道路,要么是障碍物(道路用 1 表示,障碍物用 0 表示). 已知迷宫的入口位置为 ( ...

  4. hdu 1728 逃离迷宫 (bfs)

    逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  5. 2019第十届蓝桥杯B组C++省赛E题迷宫--BFS(倒搜)

    试题 E: 迷宫 本题总分:15 分 [问题描述] 下图给出了一个迷宫的平面图,其中标记为 1 的为障碍,标记为 0 的为可以通行的地方. 010000 000100 001001 110000 迷宫 ...

  6. adv147(蓝桥杯) 学霸的迷宫 bfs

    问题描述 学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗.但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二维的格子迷宫,要进城堡必须得先通过迷宫.因为班长还有妹子要陪,磨刀不 ...

  7. P1141 01迷宫(BFS+记忆化)

    https://www.luogu.org/problemnew/show/P1141 题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样 ...

  8. hdu_1728_逃离迷宫(bfs)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1728 题意:走迷宫,找最小的拐角 题解:对BFS有了新的理解,DFS+剪枝应该也能过,用BFS就要以拐 ...

  9. [蓝桥杯2019初赛]迷宫-bfs+存储路径

    题目描述 下图给出了一个迷宫的平面图,其中标记为1 的为障碍,标记为0 的为可 以通行的地方. 010000 000100 001001 110000 迷宫的入口为左上角,出口为右下角,在迷宫中,只能 ...

最新文章

  1. CVPR2019目标检测论文看点:并域上的广义交
  2. 前端学习(2961):前一天回顾
  3. Java笔记(二)抽象类,接口,完全解耦,多重继承,内部类,静态类,匿名内部类
  4. ubuntu不锁屏设置
  5. python学习精华——成长篇
  6. 英美安全机构称俄罗斯正在暴力攻击全球数百家组织机构
  7. wangEditor关闭粘贴样式的过滤,解决小程序中xml溢出报错问题
  8. Windows解除网速限制,Windows性能提升,性能优化
  9. 开源巨献:Google最热门60款开源项目
  10. 002-用python设计的第一个游戏
  11. QT学习-核心类列表-12、QtDesigner
  12. QT造类器(操作简单)
  13. 配置商用计算机,商用计算机主板配置推荐
  14. ps入门第17天_模糊与锐化 案例:基础磨皮效果_ps修图_ps磨皮_ps高低频修图
  15. 4G通信简单验证(合宙Air720H)
  16. android 呼吸灯权限_自定义 呼吸灯 闪烁 效果 自定义View
  17. R语言基础-Rstudio基本使用
  18. 12.2 两个重要级数
  19. 天梯赛题目练习——平面向量加法(附带PTA测试点)
  20. 学习计划【硬件课程设计】【课设】

热门文章

  1. PHP个人在线要饭网站源码+LayUi框架内核
  2. 初出茅庐的小李第59篇博客之测试Modbus协议的继电器
  3. SWMM从入门到实践教程 02 快速入门案例的绘制
  4. VS配置电脑系统变量(VS2013+matlab2018a)
  5. Linux离线安装python第三方库详细步骤
  6. EXCEL做回测的基本框架
  7. hex和bin文件的区别和读取
  8. BAT的程序员,是如何精进Python数据分析技术的?
  9. PC企业微信HOOK接口开源
  10. GD32F427开发板试用 驱动TM1640显示屏