【牛客练习赛12-B】迷宫(BFS)
链接:https://www.nowcoder.net/acm/contest/68/B
题目描述
这是一个关于二维迷宫的题目。我们要从迷宫的起点 'S' 走到终点 'E',每一步我们只能选择上下左右四个方向中的一个前进一格。 'W' 代表墙壁,是不能进入的位置,除了墙壁以外的地方都可以走。迷宫内的 'D' 代表一道上锁的门,只有在持有钥匙的时候才能进入。而 'K' 则代表了钥匙,只要进入这一格,就会自动地拿到钥匙。最后 '.' 则是代表空无一物的地方,欢迎自在的游荡。
本题的迷宫中,起点、终点、门跟钥匙这四个特殊物件,每一个恰好会出现一次。而且,此迷宫的四周 (最上面的一行、最下面的一行、最左边的一列以及最右边的一列) 都会是墙壁。
请问,从起点到终点,最少要走几步呢?
输入描述:
输入的第一行有两个正整数H, W,分别代表迷宫的长跟宽。
接下来的H行代表迷宫,每行有一个长度恰为W的字串,此字串只包含`'S'`, `'E'`, `'W'`, `'D '`, `'K'`, `'.'`这几种字元。
输出描述:
请在一行中输出一个整数代表答案,如果无法从起点走到终点,请输出-1。
输入
4 12
WWWWWWWWWWWW
WE.W.S..W.KW
W..D..W....W
WWWWWWWWWWWW
输出
20
有两种情况:1.起点->终点 2.起点->钥匙->门->终点
注意第一种情况可以走钥匙的格子,不能走门的格子。
#include <bits/stdc++.h>
using namespace std;
char mp[][];
bool vis[][];
int n, m;
struct pos
{
int x, y, step;
} s, e;
int bfs(int x1, int y1, int x2, int y2)
{
int nx[][] = {, , , , , -, -, };
s.x = x1, s.y = y1, e.x = x2, e.y = y2;
queue<pos>Q;
s.step = ;
Q.push(s);
vis[s.x][s.y] = ;
while(!Q.empty())
{
pos t = Q.front();
Q.pop();
if(t.x == e.x && t.y == e.y)
return t.step;
for(int i = ; i < ; i++)
{
s.x = t.x + nx[i][];
s.y = t.y + nx[i][];
if(s.x >= &&s.x < m && s.y >= && s.y < n && mp[s.x][s.y] == '.'&& !vis[s.x][s.y])
{
vis[s.x][s.y] = ;
s.step = t.step + ;
Q.push(s);
}
}
}
return -;
}
int main()
{
scanf("%d%d", &m, &n);
for(int i = ; i < m; i++)
scanf("%s", mp[i]);
int sx, sy, ex, ey, kx, ky, dx, dy;
for(int i = ; i < m; i++)
for(int j = ; j < n; j++)
{
if(mp[i][j] == 'S') sx = i, sy = j;
else if(mp[i][j] == 'E') ex = i, ey = j;
else if(mp[i][j] == 'K') kx = i, ky = j;
else if(mp[i][j] == 'D') dx = i, dy = j;
}
mp[sx][sy] = '.', mp[ex][ey] = '.', mp[kx][ky] = '.';
int s = bfs(sx, sy, ex, ey);
memset(vis, , sizeof vis);
int s1 = bfs(sx, sy, kx, ky);
memset(vis, , sizeof vis);
mp[dx][dy] = '.';
int s2 = bfs(kx, ky, dx, dy);
memset(vis, , sizeof vis);
int s3 = bfs(dx, dy, ex, ey);
if(s == -)
{
if(s1 == - || s2 == - || s3 == -) puts("-1");
else printf("%d\n", s1 + s2 + s3);
}
else printf("%d\n", min(s, (s1 + s2 + s3)));
return ;
}
【牛客练习赛12-B】迷宫(BFS)的更多相关文章
- 最小生成树--牛客练习赛43-C
牛客练习赛43-C 链接: https://ac.nowcoder.com/acm/contest/548/C 来源:牛客网 题目描述 立华奏是一个刚刚开始学习 OI 的萌新. 最近,实力强大的 ...
- 【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D
目录 [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM SOLUTION CODE [并查集缩点+tarjan无向图求桥]Where are yo ...
- 牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 逻辑,博弈 B
牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 https://ac.nowcoder.com/acm/contest/218/B 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 2621 ...
- 牛客练习赛31 D 神器大师泰兹瑞与威穆 STL,模拟 A
牛客练习赛31 D 神器大师泰兹瑞与威穆 https://ac.nowcoder.com/acm/contest/218/D 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 26214 ...
- 牛客练习赛28-B(线段树,区间更新)
牛客练习赛28 - B 传送门 题目 qn姐姐最好了~ qn姐姐给你了一个长度为n的序列还有m次操作让你玩, 1 l r 询问区间[l,r]内的元素和 2 l r 询问区间[l,r]内的 ...
- 牛客练习赛26:D-xor序列(线性基)
链接:牛客练习赛26:D-xor序列(线性基) 题意:小a有n个数,他提出了一个很有意思的问题:他想知道对于任意的x, y,能否将x与这n个数中的任意多个数异或任意多次后变为y 题解:线性基 #inc ...
- [堆+贪心]牛客练习赛40-B
传送门:牛客练习赛40 题面: 小A手头有 n 份任务,他可以以任意顺序完成这些任务,只有完成当前的任务后,他才能做下一个任务 第 i 个任务需要花费 x_i 的时间,同时完成第 i 个任务的时间不 ...
- 牛客练习赛 29 E 位运算?位运算!(线段树)
题目链接 牛客练习赛29E 对$20$位分别建立线段树.首先$1$和$2$可以合起来搞(左移右移其实是等效的) 用个lazy标记下.转移的时候加个中间变量. $3$和$4$其实就是区间$01$覆盖操 ...
- 牛客练习赛22C Bitset
牛客练习赛22C 一共有 n个数,第 i 个数是 xi xi 可以取 [li , ri] 中任意的一个值. 设 ,求 S 种类数. 感觉二进制真是一个神奇的东西. #include <iost ...
随机推荐
- Feature Pyramid Networks for Object Detection
Feature Pyramid Networks for Object Detection 特征金字塔网络用于目标检测 论文地址:https://arxiv.org/pdf/1612.03144.pd ...
- spring-知识小结之注解为属性赋值
<1>.本类中的属性赋值 public class UserServiceImpl implements UserService { //按照类别赋值 // @Autowired //按照 ...
- kibana 创建饼图
1.在 visualize 里面选择饼图 2.选择数据源 3.选择 terms 聚合类型. 选择字段 xxx.keyword 保存即可.
- nodejs的http.request使用post方式提交数据请求
官方api文档 http://nodejs.org/docs/v0.6.1/api/http.html#http.request虽然也有POST例子,但是并不完整. 直接上代码:http_post.j ...
- Bootstrap总结二
参考我的博客:http://www.isedwardtang.com/2017/09/01/bootstrap-primer-2/
- Ubuntu 16.04 安装Django
> pip install django==1.10.3......或者:> pip3 install django==1.10.3(我采用)......或者:>python3 -m ...
- Python3.x:pyodbc连接Sybase数据库操作(Windows系统下DNS模式)
Python3.x:pyodbc连接Sybase数据库操作(Windows系统下DNS模式) 一.安装模块pyodbc pip install pyodbc 二.配置odbc数据源 (1).windo ...
- MySQL数据库表分区功能详解
1.什么是表分区? mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可以通过my.cnf中的datadir来查看),一张表主要对应着三个文件,一个是frm存放表 ...
- SQuirrel-GUI工具安装手册-基于phoenix驱动
背景描述: SQuirrel sql client 官方地址:http://www.squirrelsql.org/index.php?page=screenshots 一个图形界面的管理工具 安装手 ...
- setState详解
我们都知道,React通过this.state来访问state,通过this.setState()方法来更新state.当this.setState()方法被调用的时候,React会重新调用rende ...