Newcoder 68 B.迷宫(bfs)
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)相关推荐
- 献给阿尔吉侬的花束(二刷,迷宫bfs,模板题)
文章目录 Question Ideas Code Question 阿尔吉侬是一只聪明又慵懒的小白鼠,它最擅长的就是走各种各样的迷宫. 今天它要挑战一个非常大的迷宫,研究员们为了鼓励阿尔吉侬尽快到达终 ...
- 【动态规划】机器人走迷宫-BFS
机器人走迷宫-BFS 题目描述:给一个矩阵,0代表可走位置,1代表障碍物 给定起点和终点和行走规则(上.下.左.右),输出最短路径 探寻最短路径-BFS 首先定义两个辅助函数,valid_action ...
- 蓝桥杯 python 走迷宫 BFS
蓝桥杯 python 走迷宫 BFS 题目描述 给定一个 N × × × M 的网格迷宫 G.GG的每个格子要么是道路,要么是障碍物(道路用 1 表示,障碍物用 0 表示). 已知迷宫的入口位置为 ( ...
- hdu 1728 逃离迷宫 (bfs)
逃离迷宫 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- 2019第十届蓝桥杯B组C++省赛E题迷宫--BFS(倒搜)
试题 E: 迷宫 本题总分:15 分 [问题描述] 下图给出了一个迷宫的平面图,其中标记为 1 的为障碍,标记为 0 的为可以通行的地方. 010000 000100 001001 110000 迷宫 ...
- adv147(蓝桥杯) 学霸的迷宫 bfs
问题描述 学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗.但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二维的格子迷宫,要进城堡必须得先通过迷宫.因为班长还有妹子要陪,磨刀不 ...
- P1141 01迷宫(BFS+记忆化)
https://www.luogu.org/problemnew/show/P1141 题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样 ...
- hdu_1728_逃离迷宫(bfs)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1728 题意:走迷宫,找最小的拐角 题解:对BFS有了新的理解,DFS+剪枝应该也能过,用BFS就要以拐 ...
- [蓝桥杯2019初赛]迷宫-bfs+存储路径
题目描述 下图给出了一个迷宫的平面图,其中标记为1 的为障碍,标记为0 的为可 以通行的地方. 010000 000100 001001 110000 迷宫的入口为左上角,出口为右下角,在迷宫中,只能 ...
最新文章
- CVPR2019目标检测论文看点:并域上的广义交
- 前端学习(2961):前一天回顾
- Java笔记(二)抽象类,接口,完全解耦,多重继承,内部类,静态类,匿名内部类
- ubuntu不锁屏设置
- python学习精华——成长篇
- 英美安全机构称俄罗斯正在暴力攻击全球数百家组织机构
- wangEditor关闭粘贴样式的过滤,解决小程序中xml溢出报错问题
- Windows解除网速限制,Windows性能提升,性能优化
- 开源巨献:Google最热门60款开源项目
- 002-用python设计的第一个游戏
- QT学习-核心类列表-12、QtDesigner
- QT造类器(操作简单)
- 配置商用计算机,商用计算机主板配置推荐
- ps入门第17天_模糊与锐化 案例:基础磨皮效果_ps修图_ps磨皮_ps高低频修图
- 4G通信简单验证(合宙Air720H)
- android 呼吸灯权限_自定义 呼吸灯 闪烁 效果 自定义View
- R语言基础-Rstudio基本使用
- 12.2 两个重要级数
- 天梯赛题目练习——平面向量加法(附带PTA测试点)
- 学习计划【硬件课程设计】【课设】