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

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

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

输入格式

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

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

输出格式

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

样例输入

P.####.#P#
..#..#...#
..#T##.#.#
..........
..##.#####
..........
#####...##
###....S##

样例输出


bfs 的时候标记数组多开一维度表示是否已经取得了钥匙的状态。如果到达终点并且取得钥匙的状态被标记,bfs 结束。

所以我们需要把vis数组开成三维,第三个维度来标记是否拿到钥匙,也就是同一个点其实可以走两次,第一次是没拿到钥匙的时候,第二次是拿到钥匙的时候

 #include<cstdio>
#include<queue>
#include<cstring>
using namespace std; int n,m;
char mat[][];
bool vis[][][];
int dir[][]={,,-,,,-,,}; struct node{
int x,y,step,op;
node(){}
node(int _x,int _y,int _step,int _op):x(_x),y(_y),step(_step),op(_op){}
}st,key; void bfs(node u) {
queue<node> q;
q.push(u);
vis[u.x][u.y][]=;
while(!q.empty()) {
node f=q.front();
q.pop();
printf("x=%d y=%d step=%d op=%d\n",f.x,f.y,f.step,f.op);
if(mat[f.x][f.y]=='T'&&f.op) {
printf("%d",f.step);
return ;
}
for(int i=;i<;i++) {
int nx=f.x+dir[i][];
int ny=f.y+dir[i][];
if(vis[nx][ny][f.op]||nx<||nx>=n||ny<||ny>=m||mat[nx][ny]=='#') continue;
if(mat[nx][ny]=='P') {
q.push(node(nx,ny,f.step+,));
vis[nx][ny][]=;
}
else
{
q.push(node(nx,ny,f.step+,f.op));
vis[nx][ny][f.op]=;
}
}
}
} int main() {
scanf("%d%d",&n,&m);
for(int i=;i<n;i++) {
scanf("%s",mat[i]);
for(int j=;j<m;j++) {
if(mat[i][j]=='S') {
st.x=i;
st.y=j;
st.step=;
st.op=;
}
}
}
bfs(st);
return ;
}

-

最新文章

  1. Oracle insert大量数据经验之谈(转)
  2. 提取c#代码文件中的方法块
  3. 关于MFC文本框输入内容的获取 与 设置文本框的内容
  4. 【UR #2】树上GCD
  5. shell中 &quot;&quot; 跟 &#39;&#39;的区别
  6. Runtime 、 Block
  7. svn提交自动同步到web目录
  8. careercup-高等难度 18.9
  9. Cocos2d-x CCEditBox &amp; CCTextFieldTTF
  10. PowerDesigner将PDM导出生成WORD文档--温习老知识
  11. 自定义UITableView的Seperator
  12. scala中的Type使用
  13. nmap工具简介
  14. Codeforces Round #436 (Div. 2)C. Bus 模拟
  15. python 数据可视化 -- 读取数据
  16. centos7 防火墙 开启端口 并测试
  17. springcloud(八) Hystrix监控
  18. 洛谷 P2899 [USACO08JAN]手机网络Cell Phone Network(树形动规)
  19. JAVA:连接池技术说明以及MVC设计模式理解
  20. kaggle kernel使用指南

热门文章

  1. Day4-T1
  2. 在登陆退出时候使用Vuex
  3. c++ auto_ptr笔记
  4. 15 —— npm —— package.json 与 package-lock.json 的作用
  5. BZOJ:2243: [SDOI2011]染色
  6. 大二暑假第二周总结--开始学习Hadoop基础(一)
  7. logrotate+crond日志切割、轮询
  8. springboot-jar-web
  9. Comet OJ - Contest #15(B: 当我们同心在一起 )
  10. [GXYCTF2019]BabySQli