链接:https://ac.nowcoder.com/acm/problem/22344
来源:牛客网

精通程序设计的 Applese 双写了一个游戏。

在这个游戏中,它被困在了一个 n×m 的迷宫中,它想要逃出这个迷宫。

在迷宫中,有一些方格是水池,只有当 Applese 处于水属性的时候才可以通过;有一些方格是岩浆,只有当 Applese 是火属性的时候可以通过;有一些方格是墙壁,无论如何都无法通过;另一些格子是空地(包括起点和终点),可以自由通过。

在一些空地上有神秘道具可以让 Applese 转换自己的属性(从水属性变为火属性或从火属性变为水属性,需要一个单位的时间)。

已知 Applese 在一个单位的时间内可以朝四个方向行走一格,且开始处于水属性,位于空地的道具拾取后只能在该处立即使用(或者不使用),且可以多次使用。求它走出迷宫需要的最少时间。
输入描述:
第一行两个正整数 n, m 表示迷宫的大小。
接下来 n 行,每行长度为 m 的字符串。描述地图。
其中 ‘S’ 表示起点,‘T’ 表示终点,’.’ 表示空地,‘w’表示岩浆,’~‘表示水池,’@’ 表示道具,’#'表示障碍。
保证地图中的起点和终点只有一个,道具都位于空地。

5 5
.w@..
.S#..
~w#..
.w..~
@w.~T

输出:

18

备注:
1≤n,m≤100
Ac_code:

#include <stdio.h>
#include <queue>
const int maxn = 105;
using namespace std;
int n,m,sx,sy,ex,ey;
struct point
{int x,y;int now, step;bool operator <(const point &p)const{return step > p.step;}
};
char mp[maxn][maxn];
bool vis[maxn][maxn][2];
int dx[]= {-1,1,0,0},dy[]= {0,0,-1,1};
int bfs()
{point s;s.x = sx,s.y = sy;s.now = 0,s.step = 0;vis[s.x][s.y][s.now] = true;priority_queue<point>q;q.push(s);while(!q.empty()){point k = q.top();q.pop();if(k.x==ex&&k.y==ey){return k.step;}point t;for(int i = 0; i < 4; i++){t.x = k.x + dx[i];t.y = k.y + dy[i];t.now = k.now;t.step = k.step + 1;if(t.x<0||t.x>=n||t.y<0||t.y>=m)continue;if(mp[t.x][t.y]=='#')continue;if(!vis[t.x][t.y][t.now]){if(mp[t.x][t.y]=='.'||mp[t.x][t.y]=='S'||mp[t.x][t.y]=='T'||mp[t.x][t.y]=='@'){vis[t.x][t.y][t.now] = true;q.push(t);}else if((mp[t.x][t.y]=='~'&&k.now==0)||(mp[t.x][t.y]=='w'&&k.now==1)){vis[t.x][t.y][t.now] = true;q.push(t);}}if(mp[k.x][k.y]=='@'){t.now = !k.now;if(vis[t.x][t.y][t.now])continue;if((mp[t.x][t.y]=='~'&&t.now==1)||(mp[t.x][t.y]=='w'&&t.now==0))//这里要注意continue;t.step = k.step+2;vis[t.x][t.y][t.now] = true;q.push(t);}}}return -1;
}
int main()
{scanf("%d%d",&n,&m);for(int i = 0; i < n; i++){scanf("%s",mp[i]);for(int j = 0; j  < m; j++){if(mp[i][j]=='S'){sx = i;sy = j;}else if(mp[i][j]=='T'){ex = i;ey = j;}}}printf("%d\n",bfs());return 0;
}

Applese 走迷宫(优先队列+bfs)相关推荐

  1. 【牛客 - 330C】Applese 走迷宫(bfs)

    题干: 精通程序设计的 Applese 双写了一个游戏. 在这个游戏中,它被困在了一个 n×mn×m 的迷宫中,它想要逃出这个迷宫. 在迷宫中,有一些方格是水池,只有当 Applese 处于水属性的时 ...

  2. 走迷宫-双向bfs解法

    双向bfs适用于知道起点和终点的状态下使用,从起点和终点两个方向开始进行搜索,可以非常大的提高单个bfs的搜索效率 同样,实现也是通过队列的方式,可以设置两个队列,一个队列保存从起点开始搜索的状态,另 ...

  3. Bailian3752 走迷宫【BFS】

    3752:走迷宫 总时间限制: 1000ms 内存限制: 65536kB 描述 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走:有的格子是空地,可以走. 给定一个迷宫,求从左上角走到右下角最少 ...

  4. 【含泪总结】大胖子走迷宫(bfs+读懂题意)

    2548. 大胖子走迷宫 小明是个大胖子,或者说是个大大胖子,如果说正常人占用 1×1 的面积,小明要占用 5×5 的面积. 由于小明太胖了,所以他行动起来很不方便. 当玩一些游戏时,小明相比小伙伴就 ...

  5. 2548. 大胖子走迷宫 (时间bfs)

    小明是个大胖子,或者说是个大大胖子,如果说正常人占用 1×1 的面积,小明要占用 5×5 的面积. 由于小明太胖了,所以他行动起来很不方便. 当玩一些游戏时,小明相比小伙伴就吃亏很多. 小明的朋友们制 ...

  6. 小白月赛26:E牛牛走迷宫(BFS)

    题目链接小白月赛26 牛牛走迷宫 题目大意 一个n行,m列的只包含0和1矩阵,0表示可以走,1表示不能走.,从{1,1}开始移动,一次移动一格,可以向上下左右移动,条路径步数一样,他会选择走字典序最小 ...

  7. 算法基础课——走迷宫(BFS)

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

  8. 深度优先搜索和广度优先搜索及典例分析(走迷宫问题(BFS)和棋盘问题(DFS))

    搜索算法在实际编程应用中起着举足轻重的作用,学会掌握搜索算法并熟练应用搜索算法来解决实际问题不得不说是一件相当COOL的事,所以我将深度搜索和广度搜索认真地做了详细的总结,与诸君共勉,也方便以后查阅复 ...

  9. 【31. 走迷宫(BFS)】

    当要求最短路径时,并且边的权值为1时 使用BFS(广度优先搜索.) 思路 用 g[n][m] 存储地图,d[n][m] 存储起点到 n,m 的距离. 从起点开始广度优先遍历地图. 当地图遍历完,就求出 ...

最新文章

  1. 微生物组:3分和30分文章差距在哪里?
  2. PNAS “深度学习的科学”论文合集导读
  3. 从源码角度分析MapReduce的reduce流程
  4. 提取某一个镇的行政边界_接口测试:A04_HttpRunner通用_02_提取数据_02_regex方式
  5. K8S Learning(7)—— Deployment
  6. java web tomcat 实例_Java Web应用开发实例
  7. 空间数据引擎oracle_空间数据库oracle
  8. 2018杭州电子科技大学计算机研究生复试笔试编程题第三题
  9. Microsoft C++ 异常: 内存位置处的 std::bad_alloc问题解决办法
  10. MYSQL——表操作
  11. python趋势跟踪_一个趋势跟踪系统—Dual Thrust策略(期货)
  12. 流行的移动端UI框架
  13. 分类问题-决策树模型
  14. WIFI提示“已连接,但无法访问互联网”
  15. 虚拟机VMware下载与安装教程(windows)
  16. web前端html5+css3学习笔记(3)——标签
  17. Axure--使用阿里云搭建自己的原型发布站点
  18. Windows Defender 打开后一片空白,安全中心不显示
  19. 大型超市购物车蓝牙智能锁解决方案
  20. MySQL 数据存储和优化------MySQL架构原理 ---- (架构---索引---事务---锁---集群---性能---分库分表---实战---运维)持续更新

热门文章

  1. idea怎么创建python项目_idea创建django项目
  2. 没想到,Python还可以制作Web可视化页面!
  3. 翻遍全网!这4个Python项目最良心!(含视频源码)
  4. 女朋友还是游戏?一起来分析下游戏的开发与销售情况!
  5. 你真敢ZAO吗?解读换脸AI “细思极恐” 的用户协议
  6. 如何使用Python玩转PDF各种骚操作?
  7. java data是什么文件_如何用java实现 读取一个data类型文件 并显示出来(随便选择一种类型txt或者word)...
  8. python创建变量_Python每天一分钟:给类对象动态新增/删除成员变量和方法(函数)...
  9. 动态折线图 python_python 怎么做个动态折线
  10. python中while语句的用法_python 使用while循环输出*组成的菱形实例