题干:

精通程序设计的 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)相关推荐

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

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

  2. 蓝桥杯 python 走迷宫 BFS

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

  3. Applese 走迷宫(优先队列+bfs)

    链接:https://ac.nowcoder.com/acm/problem/22344 来源:牛客网 精通程序设计的 Applese 双写了一个游戏. 在这个游戏中,它被困在了一个 n×m 的迷宫中 ...

  4. DFS和BFS概念及实践+acwing 842 排列数字(dfs) +acwing 844. 走迷宫(bfs)

    DFS (深搜), 也有说就是递归的 执着: 一直搜到底,然后回溯下一个节点 数据结构 : stack (这里的栈,实际上是编译器内部的栈, 所以说也可以看成递归, 递归内部也是调用编译器内部栈) 空 ...

  5. Acwing---844. 走迷宫——BFS

    走迷宫 1.题目 2.基本思想 3.代码实现 1.题目 给定一个 n×m 的二维整数数组,用来表示一个迷宫,数组中只包含 0 或 1,其中 0 表示 可以走的路,1 表示不可通过的墙壁.最初,有一个人 ...

  6. 844. 走迷宫 + BFS

    给定一个 n×m 的二维整数数组,用来表示一个迷宫,数组中只包含 0 或 1,其中 0 表示可以走的路,1 表示不可通过的墙壁. 最初,有一个人位于左上角 (1,1) 处,已知该人每次可以向上.下.左 ...

  7. 计蒜客习题:走迷宫2

    问题描述 给你一个 n 行 m 列的二维迷宫.'S'表示起点,'T' 表示终点,'#' 表示墙壁,'.' 表示平地.你需要从 'S' 出发走到 'T',每次只能上下左右走动,并且不能走出地图的范围以及 ...

  8. Acwing.844 走迷宫(BFS)

    题目 给定一个n'm的二维整数数组,用来表示一个迷宫,数组中只包含0或1,其中0表示可以走的路,1表示不可通过的墙壁. 最初,有一个人位于左上角(1,1)处,已知该人每次可以向上.下.左.右任意一个方 ...

  9. 牛客网——wyh的迷宫

    wyh的迷宫 题目 思路 代码 结果 题目 给你一个n*m的迷宫,这个迷宫中有以下几个标识: s代表起点 t代表终点 x代表障碍物 .代表空地 现在你们涵哥想知道能不能从起点走到终点不碰到障碍物(只能 ...

最新文章

  1. Tensorflow 可视化 TensorBoard 尝试~
  2. 【BZOJ】1607: [Usaco2008 Dec]Patting Heads 轻拍牛头
  3. 网站建设套用模板后该如何做到出类拔萃?
  4. Kafka中文官方文档
  5. 修改 framework 代码的经验和踩过的坑
  6. 域用户和计算机上解锁用户的账户,AD域账户锁定时间
  7. 关于swift5以上的SnapKit框架的入门教程使用
  8. 天池 在线编程 输入流
  9. 数学国里有座天才云集的“疯人院”
  10. asp.net 将bmp格式图片怎么转换为jpg_PNG图片怎么转换成JPG?原来还可以这么转换...
  11. linux查看文件元数据,Linux切换目录、查看目录下的文件、文件类型介绍和查看文件的元数据信息...
  12. go http.Get请求 http.Post请求 http.PostForm请求 Client 超时设置
  13. POJ- 1751 Highways
  14. BT5 U盘制作方法
  15. SecureCRT8.1下载+注册机+破解教程
  16. 基于改进Bisenet的五官精确分割系统(源码&教程)
  17. php后台登录页,后台登录页面模板源码
  18. (西工程-金花)小米路由器连接哆点设置WiFi保姆式教程
  19. VO、DTO、BO、QO、DO 如何使用,在那一层使用,一张图告诉你;别再纠结命名规则啦,我来告诉你
  20. CSDN如何获得2020技术圈认证(新徽章哦)

热门文章

  1. 浅尝EffectiveCSharp_1
  2. DataGridView中的CheckBox
  3. 解决用户控件循环引用的笨办法
  4. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]45.描述一些对抗RSA侧信道攻击的防御方法
  5. ueditor上传图片写入数据库_手把手教你,如何用交管12123上传驾驶证照片!
  6. Linux下删除非空文件目录
  7. php访问mysql函数吗,PHP访问MySQL数据库函数简介
  8. 7-1 模拟EXCEL排序 (25 分)
  9. 数据插不进mysql_数据插入不进数据库里面去。
  10. python将整数逆序_python练手入门小项目:字符串的妙用