【牛客 - 330C】Applese 走迷宫(bfs)
题干:
精通程序设计的 Applese 双写了一个游戏。
在这个游戏中,它被困在了一个 n×mn×m 的迷宫中,它想要逃出这个迷宫。
在迷宫中,有一些方格是水池,只有当 Applese 处于水属性的时候才可以通过;有一些方格是岩浆,只有当 Applese 是火属性的时候可以通过;有一些方格是墙壁,无论如何都无法通过;另一些格子是空地(包括起点和终点),可以自由通过。
在一些空地上有神秘道具可以让 Applese 转换自己的属性(从水属性变为火属性或从火属性变为水属性,需要一个单位的时间)。
已知 Applese 在一个单位的时间内可以朝四个方向行走一格,且开始处于水属性,位于空地的道具拾取后只能在该处立即使用(或者不使用),且可以多次使用。求它走出迷宫需要的最少时间。
输入描述:
第一行两个正整数 n, m 表示迷宫的大小。 接下来 n 行,每行长度为 m 的字符串。描述地图。 其中 'S' 表示起点,'T' 表示终点,'.' 表示空地,'w'表示岩浆,'~'表示水池,'@' 表示道具,'#'表示障碍。 保证地图中的起点和终点只有一个,道具都位于空地。
输出描述:
输出一个整数,表示 Applese 走出迷宫的最短时间。特别地,如果 Applese 走不出迷宫,输出 "-1"。
示例1
输入
复制
5 5 .w@.. .S#.. ~w#.. .w..~ @w.~T
输出
复制
18
备注:
1≤n,m≤100
解题报告:
直接bfs就行了,,注意要用pq,,不能直接用队列、、之前在这里就栽过坑。。。还有啊,,根据样例,起点是可以重复走的、、(代码虽然挺好看但是还是比较冗长的、、)
AC代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int MAX = 2e5 + 5;
char maze[505][505];
bool vis[505][505][2];//0:水 1:火
int nx[4] = {0,1,0,-1};
int ny[4] = {1,0,-1,0};
struct Node {int x,y;int t;bool q;Node(){}Node(int x,int y,int t,bool q):x(x),y(y),t(t),q(q){}bool operator<(const Node b) const{return t > b.t;}
};
int n,m;
int edx,edy,stx,sty;
bool ok(int x,int y) {if(x >=1 && x <= n && y >= 1 && y <= m) return 1;else return 0 ;
}
int bfs(int stx,int sty) {priority_queue<Node> q;q.push(Node(stx,sty,0,0));vis[stx][sty][0] = 1;while(q.size()) {Node cur = q.top();q.pop();if(cur.x == edx && cur.y == edy) return cur.t;for(int k = 0; k<4; k++) {int tx = cur.x + nx[k];int ty = cur.y + ny[k];if(!ok(tx,ty)) continue;if(maze[tx][ty] == 'T') return cur.t+1;if(maze[tx][ty] == '.') {if(vis[tx][ty][cur.q] == 0) vis[tx][ty][cur.q] = 1, q.push(Node(tx,ty,cur.t+1,cur.q));}if(maze[tx][ty] == 'w') {if(vis[tx][ty][cur.q] == 0 && cur.q == 1) vis[tx][ty][cur.q] = 1, q.push(Node(tx,ty,cur.t+1,cur.q));}if(maze[tx][ty] == '~') {if(vis[tx][ty][cur.q] == 0 && cur.q == 0) vis[tx][ty][cur.q] = 1, q.push(Node(tx,ty,cur.t+1,cur.q));}if(maze[tx][ty] == '#') continue;if(maze[tx][ty] == '@') {if(vis[tx][ty][cur.q] == 0) vis[tx][ty][cur.q] = 1, q.push(Node(tx,ty,cur.t+1,cur.q));if(vis[tx][ty][!cur.q] == 0) vis[tx][ty][!cur.q] = 1, q.push(Node(tx,ty,cur.t+2,!cur.q));}}}return -1;
}
int main()
{cin>>n>>m;for(int i = 1; i<=n; i++) {scanf("%s",maze[i]+1);}for(int i = 1; i<=n; i++) {for(int j = 1; j<=m; j++) {if(maze[i][j] == 'S') stx = i, sty = j,maze[i][j] = '.';if(maze[i][j] == 'T') edx = i, edy = j;}}int ans = bfs(stx,sty);printf("%d\n",ans);return 0 ;}
【牛客 - 330C】Applese 走迷宫(bfs)相关推荐
- 【动态规划】机器人走迷宫-BFS
机器人走迷宫-BFS 题目描述:给一个矩阵,0代表可走位置,1代表障碍物 给定起点和终点和行走规则(上.下.左.右),输出最短路径 探寻最短路径-BFS 首先定义两个辅助函数,valid_action ...
- 蓝桥杯 python 走迷宫 BFS
蓝桥杯 python 走迷宫 BFS 题目描述 给定一个 N × × × M 的网格迷宫 G.GG的每个格子要么是道路,要么是障碍物(道路用 1 表示,障碍物用 0 表示). 已知迷宫的入口位置为 ( ...
- Applese 走迷宫(优先队列+bfs)
链接:https://ac.nowcoder.com/acm/problem/22344 来源:牛客网 精通程序设计的 Applese 双写了一个游戏. 在这个游戏中,它被困在了一个 n×m 的迷宫中 ...
- DFS和BFS概念及实践+acwing 842 排列数字(dfs) +acwing 844. 走迷宫(bfs)
DFS (深搜), 也有说就是递归的 执着: 一直搜到底,然后回溯下一个节点 数据结构 : stack (这里的栈,实际上是编译器内部的栈, 所以说也可以看成递归, 递归内部也是调用编译器内部栈) 空 ...
- Acwing---844. 走迷宫——BFS
走迷宫 1.题目 2.基本思想 3.代码实现 1.题目 给定一个 n×m 的二维整数数组,用来表示一个迷宫,数组中只包含 0 或 1,其中 0 表示 可以走的路,1 表示不可通过的墙壁.最初,有一个人 ...
- 844. 走迷宫 + BFS
给定一个 n×m 的二维整数数组,用来表示一个迷宫,数组中只包含 0 或 1,其中 0 表示可以走的路,1 表示不可通过的墙壁. 最初,有一个人位于左上角 (1,1) 处,已知该人每次可以向上.下.左 ...
- 计蒜客习题:走迷宫2
问题描述 给你一个 n 行 m 列的二维迷宫.'S'表示起点,'T' 表示终点,'#' 表示墙壁,'.' 表示平地.你需要从 'S' 出发走到 'T',每次只能上下左右走动,并且不能走出地图的范围以及 ...
- Acwing.844 走迷宫(BFS)
题目 给定一个n'm的二维整数数组,用来表示一个迷宫,数组中只包含0或1,其中0表示可以走的路,1表示不可通过的墙壁. 最初,有一个人位于左上角(1,1)处,已知该人每次可以向上.下.左.右任意一个方 ...
- 牛客网——wyh的迷宫
wyh的迷宫 题目 思路 代码 结果 题目 给你一个n*m的迷宫,这个迷宫中有以下几个标识: s代表起点 t代表终点 x代表障碍物 .代表空地 现在你们涵哥想知道能不能从起点走到终点不碰到障碍物(只能 ...
最新文章
- Tensorflow 可视化 TensorBoard 尝试~
- 【BZOJ】1607: [Usaco2008 Dec]Patting Heads 轻拍牛头
- 网站建设套用模板后该如何做到出类拔萃?
- Kafka中文官方文档
- 修改 framework 代码的经验和踩过的坑
- 域用户和计算机上解锁用户的账户,AD域账户锁定时间
- 关于swift5以上的SnapKit框架的入门教程使用
- 天池 在线编程 输入流
- 数学国里有座天才云集的“疯人院”
- asp.net 将bmp格式图片怎么转换为jpg_PNG图片怎么转换成JPG?原来还可以这么转换...
- linux查看文件元数据,Linux切换目录、查看目录下的文件、文件类型介绍和查看文件的元数据信息...
- go http.Get请求 http.Post请求 http.PostForm请求 Client 超时设置
- POJ- 1751 Highways
- BT5 U盘制作方法
- SecureCRT8.1下载+注册机+破解教程
- 基于改进Bisenet的五官精确分割系统(源码&教程)
- php后台登录页,后台登录页面模板源码
- (西工程-金花)小米路由器连接哆点设置WiFi保姆式教程
- VO、DTO、BO、QO、DO 如何使用,在那一层使用,一张图告诉你;别再纠结命名规则啦,我来告诉你
- CSDN如何获得2020技术圈认证(新徽章哦)
热门文章
- 浅尝EffectiveCSharp_1
- DataGridView中的CheckBox
- 解决用户控件循环引用的笨办法
- [密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]45.描述一些对抗RSA侧信道攻击的防御方法
- ueditor上传图片写入数据库_手把手教你,如何用交管12123上传驾驶证照片!
- Linux下删除非空文件目录
- php访问mysql函数吗,PHP访问MySQL数据库函数简介
- 7-1 模拟EXCEL排序 (25 分)
- 数据插不进mysql_数据插入不进数据库里面去。
- python将整数逆序_python练手入门小项目:字符串的妙用