蒜头君要回家,但是他家的钥匙在他的朋友花椰妹手里,他要先从花椰妹手里取得钥匙才能回到家。花椰妹告诉他:“你家的钥匙被我复制了很多个,分别放在不同的地方。”

蒜头君希望能尽快回到家中,他需要首先取得任意一把钥匙,请你帮他计算出回家所需要的最短路程。

蒜头君生活的城市可以看做是一个 n \times mn×m的网格,其中有道路有障碍,钥匙和家所在的地方可以看做是道路,可以通过。蒜头君可以在城市中沿着上下左右 44 个方向移动,移动一个格子算做走一步。

输入格式

第一行有两个整数 nn,mm。城市的地图是 nn行 mm 列。(1 \leq n,m \leq 20001≤n,m≤2000)

接下来的 nn 行,每行 mm 个字符,代表城市的地图。'.' 代表道路,'#' 代表障碍物,'S' 代表蒜头君所在的位置,'T' 代表蒜头家的位置,'P'代表钥匙的位置。除了障碍物以外,别的地方都可以通过。(题目保证蒜头君至少有一条路径可以顺利拿到钥匙并且回家)

输出格式

输出蒜头回家要走的最少步数,占一行。

样例输入

8 10
P.####.#P#
..#..#...#
..#T##.#.#
..........
..##.#####
..........
#####...##
###....S##

样例输出

21

主要思路是从起点广搜一遍钥匙,再从终点广搜一遍,将两次累加再e[x][y]里,取最优即可

#include<bits/stdc++.h>
using namespace std;
struct node{          //构造方法int x,y,num;node(){}node(int x,int y,int num){  this->x = x;  this->y = y;  this->num = num;  }
};
char a[2002][2002];
map<int,map<int,int> > e;
int f[4][2]={0,1,1,0,0,-1,-1,0},step=0xffffff, v[2002][2002]={0},n,m;
void bfs(int x,int y)
{node s;queue<node> q;q.push(node(x,y,0));int sum=0;while(!q.empty()){s=q.front();q.pop();for(int i=0;i<4;i++){int x1=s.x+f[i][0];int y1=s.y+f[i][1];if(v[x1][y1]==0&&(a[x1][y1]=='.'||a[x1][y1]=='P'||a[x1][y1]=='T'||a[x1][y1]=='S')){q.push(node(x1,y1,s.num+1));v[x1][y1]=1;if(a[x1][y1]=='P'){if(e[x1][y1]!=0){e[x1][y1]+=s.num+1;step=min(e[x1][y1],step);}else {e[x1][y1]+=s.num+1;}}}}}for(int i=0;i<=n;i++){for(int j=0;j<=m;j++){v[i][j]=0;}}
}
int main()
{int x1,y1,x2,y2;cin>>n>>m;for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>a[i][j];if(a[i][j]=='S'){x1=i;y1=j;}else if(a[i][j]=='T'){x2=i;y2=j;}}}bfs(x1,y1);bfs(x2,y2);cout<<step;
}

计蒜客--蒜头君回家相关推荐

  1. 计蒜客-蒜头君回家(bfs)

    蒜头君要回家,但是他家的钥匙在他的朋友花椰妹手里,他要先从花椰妹手里取得钥匙才能回到家.花椰妹告诉他:"你家的钥匙被我复制了很多个,分别放在不同的地方." 蒜头君希望能尽快回到家中 ...

  2. 计蒜客 - 蒜头君的任务

    计蒜客 蒜头君的任务 题目描述 蒜头君的上司给蒜头君布置了一个任务,蒜头君维护一个数列,要求提供以下两种操作: 查询操作. 语法:Q L 功能:查询当前数列中末尾 L L L 个数中的最大的数,并输出 ...

  3. 计蒜客--蒜头君的新游戏

    1000ms  131072K 工作空闲之余,蒜头君经常带着同事们做游戏,最近蒜头君发明了一个好玩的新游戏:n 位同事围成一个圈,同事 A 手里拿着一个兔妮妮的娃娃.蒜头君喊游戏开始,每位手里拿着娃娃 ...

  4. 计蒜客 蒜头君的训练室

    问题描述 蒜头君的训练室有 N 个站点,另外有 M 条单向边连接这些站点.第 i 条路从 Si站到 Ei站,有高度为 Hi的围栏,蒜头君是需要跳跃的.  现在蒜头君们有 T 个任务要完成.第 ii 个 ...

  5. 计蒜客 蒜头君学英语

    问题 蒜头君快要考托福了,这几天,蒜头君每天早上都起来记英语单词.花椰妹时不时地来考一考蒜头君:花椰妹会询问蒜头君一个单词,如果蒜头君背过这个单词,蒜头君会告诉花椰妹这个单词的意思,不然蒜头君会跟花椰 ...

  6. 计蒜客 蒜头君的购物口袋2 01背包问题

    蒜头君去超市购物,他有一只容量为 V 的购物袋,同时他想买n 件物品,已知每件物品的体积 ivi​和重要度pi​.蒜头君想知道,挑选哪些物品放入购物袋中,可以使得买到的物品重要度之和最大,且物品体积和 ...

  7. 计蒜客- 蒜头君的工厂

    E 蒜头君的工厂需要生产 n 个产品,每个产品会在记录本上记录开始生产的时间 x 以及完成生产的时间 y. 现在蒜头君拿到这本记录本以后想知道最多有多少件产品同时在生产线上生产. 注意:在同一时刻总是 ...

  8. [Java] 计蒜客---蒜头君的玩具

    一.内容 二.思路 用差分数组算出每个点总共被包含了几次,比如1-4就等于1-4区间的数组都加上1.这样a数组最终保存的就是装了这个点总共被覆盖几次. 由于每次只能选3条线段,所以数组里面每个点的值必 ...

  9. 计蒜客 蒜头君的数轴

    不考虑某个区间,其他区间必须距离相等,也就是要划分为距离为最大公约数. 那么如何快速求解任意$n-1$个区间的最大公约数?用l[i]表示前i个数的最大公约数,r[i]表示后$(n-i)$个区间的最大公 ...

最新文章

  1. GNN教程:与众不同的预训练模型!
  2. Java中classpath配置
  3. 系统登录界面的验证码
  4. sql中 set 和select 的区别
  5. jQuery、jQury UI、jQuery Mobile----读书笔记
  6. 你会接受同门师兄的追求吗?
  7. matlab axis 用法,MATLAB中regionprops的用法
  8. python数据可视化的特点_python的数据分析到底是啥?python数据可视化怎么做?
  9. 前端请求后端数据的三种方式
  10. final finalize finally比较
  11. NodeJS集成Redis实战
  12. 【基础知识】【模块介绍】0.96寸OLED显示屏(SSD1306)基础命令和寻址方法
  13. Java小白之编写:计算个税的程序
  14. 上门洗车App 竟然是块大肥肉!
  15. 怎么样才可以逆天改命
  16. 九爷带你了解 nginx 的反向代理
  17. 计划任务linux每天执行一次,linux 每天执行任务计划
  18. Android性能优化系列之Bitmap图片优化
  19. electron---windows客户端开发探索
  20. 网络数据安全法解读第三篇

热门文章

  1. 多伦多大学朱子宁:一种选择语言探针的信息论观点
  2. 苹果手机投影_手机连接投影机的步骤
  3. C语言(谭浩强版本,主讲人:小甲鱼)P41-P49
  4. wannier拟合能带总是拟合不上_科学网-Wannier90输入文件中num_wann, num_bands, 和energy window等参数设置规则-李云海的博文...
  5. v-chart 图表样式调整 条形图位置调整及在条形图右边显示文字
  6. 操作系统-文件存储空间管理
  7. 5角硬币中的币王,已价值16000元,谁家有?
  8. 【清北学堂济南刷题班】集合
  9. 【AMD、CMD和CommonJS】
  10. 如何说服老板页面兼容IE9+