诡异的楼梯
Problem Description
Hogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方向. 
比如下面的例子里,一开始楼梯在竖直方向,一分钟以后它移动到了水平方向,再过一分钟它又回到了竖直方向.Harry发现对他来说很难找到能使得他最快到达目的地的路线,这时Ron(Harry最好的朋友)告诉Harry正好有一个魔法道具可以帮助他寻找这样的路线,而那个魔法道具上的咒语,正是由你纂写的. 
Input
测试数据有多组,每组的表述如下:
第一行有两个数,M和N,接下来是一个M行N列的地图,'*'表示障碍物,'.'表示走廊,'|'或者'-'表示一个楼梯,并且标明了它在一开始时所处的位置:'|'表示的楼梯在最开始是竖直方向,'-'表示的楼梯在一开始是水平方向.地图中还有一个'S'是起点,'T'是目标,0<=M,N<=20,地图中不会出现两个相连的梯子.Harry每秒只能停留在'.'或'S'和'T'所标记的格子内.
Output
只有一行,包含一个数T,表示到达目标的最短时间. 
注意:Harry只能每次走到相邻的格子而不能斜走,每移动一次恰好为一分钟,并且Harry登上楼梯并经过楼梯到达对面的整个过程只需要一分钟,Harry从来不在楼梯上停留.并且每次楼梯都恰好在Harry移动完毕以后才改变方向.
Sample Input
   
5 5 **..T **.*. ..|.. .*.*. S....

Sample Output
   
7

Hint

Hint

地图如下:

思路:

BFS即可,碰见楼梯了,能走则走,不能走则选择原地待步。
代码:
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
char s[22][22];
int vis[22][22];
int to[][2]= {0,1,0,-1,1,0,-1,0};
int n,m;
struct node
{int x,y,step;
};
int judge(int x,int y)//判断是否符合条件
{if(x>=0&&x<n&&y>=0&&y<m&&!vis[x][y]&&s[x][y]!='*')return 1;return 0;
}
int bfs(int x,int y)
{memset(vis,0,sizeof(vis));node now,next;queue<node>q;now.x=x,now.y=y,now.step=0;vis[x][y]=1;q.push(now);while(!q.empty()){now=q.front();if(s[now.x][now.y]=='T')return now.step;int flag=0,flog=0;//flag记录本次原地待命的次数,flog用来判断如果楼梯能走,那么过楼梯后的点是否已走过for(int i=0; i<4; i++){int xx=now.x+to[i][0],yy=now.y+to[i][1];if(judge(xx,yy)){next.step=now.step+1;if(s[xx][yy]=='|'){if(s[xx+to[i][0]][yy+to[i][1]]=='*')//判断楼梯后面是否是墙continue;if(next.step&1)//奇数步之后还是'|'{if(to[i][0]!=0)//如果是上下走xx+=to[i][0],flog=1;else//否则,则原地待步xx-=to[i][0],yy-=to[i][1],flag++;}else//'|'变成了'-'{if(to[i][0]==0)//如果是左右走yy+=to[i][1],flog=1;else//否则,则原地待步xx-=to[i][0],yy-=to[i][1],flag++;}}else if(s[xx][yy]=='-')//同上{if(s[xx+to[i][0]][yy+to[i][1]]=='*')continue;if(next.step&1){if(to[i][0]==0)yy+=to[i][1],flog=1;elsexx-=to[i][0],yy-=to[i][1],flag++;}else{if(to[i][0]!=0)xx+=to[i][0],flog=1;elsexx-=to[i][0],yy-=to[i][1],flag++;}}if(flag>1||(flog&&vis[xx][yy]))//如果本次已经有过原地待命或者(楼梯能走,但是楼梯后的点是已走过的点)(剪枝,不减会爆内存)continue;vis[xx][yy]=1;next.x=xx,next.y=yy;q.push(next);}}q.pop();}
}
int main()
{while(~scanf("%d%d",&n,&m)){int i,j,x,y;for(i=0; i<n; i++){scanf("%s",s[i]);for(j=0; j<m; j++){if(s[i][j]=='S')x=i,y=j;}}int ans=bfs(x,y);printf("%d\n",ans);}return 0;
}

ps:没剪枝之前一直爆内存啊爆 ,先是改了如果同一个点有多个方向需要原地等待,那就等待一次,其他的减掉,交了上去还是爆啊0.0。。又继续debug,盯了一下中间过程,结果发现有重复步骤,原来是走过楼梯之后由于没有让楼梯标记走过,所以又走回去了,于是加了一个判断楼梯后面是否走过,交了一发,终于A了 ,Debug一上午不容易啊 ~Orz

来几组测试数据:
5 5
**..T
**.*.
**|..
**.**
S..**
5 5
**..T
**.*.
**-..
**.**
S..**
5 5
.|.-T
-*-*|
.*.|.
-*-**
S|.**
5 5
S....
-|-|-
.....
-|-|-
....T
1 3
S-T
1 3
S|T
1 5
S|.|T
1 5
S-.-T
1 5
S|.-T
1 5
S-.|T
2 5
*.-.T
.S.|.
1 2
ST
2 4
-|.S
|T.-
1 5
S.-.T
3 5
.|*.T
.-.|.
S.-*.
5 5
**..T
**.*.
**-..
**.**
S..**
5 5
.|.-T
-*-*|
.*.|.
-*-**
S|.**
5 5
S....
-|-|-
.....
-|-|-
....T
1 3
S-T
1 3
S|T
1 5
S|.|T
1 5
S-.-T
1 5
S|.-T
1 5
S-.|T
2 5
*.-.T
.S.|.
1 2
ST
2 4
-|.S
|T.-
1 5
S.-.T
3 5
.|*.T
.-.|.
S.-*.
3 4
T...
*-*S
*.|.
4 3
T**
.|.
.*-
.S.
3 4
S|.|
-T-.
.|..
5 4
..*T
*.*.
*.*.
.|..
S.*.
Output:
8
7
7
8
1
2
4
3
3
2
3
1
3
4
5
7
7
8
1
2
4
3
3
2
3
1
3
4
5
4
4
7
6

hdu 诡异的楼梯(BFS)相关推荐

  1. 诡异的楼梯 bfs

    诡异的楼梯 原题链接https://vjudge.net/contest/345248#problem/M 由题意可知,题目大概还是一个迷宫问题,大概思路不变,但是需要增加情况,对于到楼梯前的时候我们 ...

  2. HDU 1180 诡异的楼梯(超级经典的bfs之一,需多回顾)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1180 诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others)     ...

  3. hdu1180 诡异的楼梯(BFS+优先队列)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1180 诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others)     ...

  4. HDU 1180 诡异的楼梯

    诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Sub ...

  5. HDU 1180 诡异的楼梯

    诡异的楼梯 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) Total Submis ...

  6. 【算法设计与分析】HDU-1108 C++诡异的楼梯(BFS迷宫最短路径)

    一.题目描述 Problem Description Hogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方向. 比如下面的例子里 ...

  7. HDU - 1495 非常可乐(BFS,数学)

    HDU - 1495 非常可乐(BFS,数学) 巨佬的数学解法 #include<iostream> using namespace std; int gcd(int a,int b) { ...

  8. HDOJ/HDU 1180 诡异的楼梯(经典BFS-详解)

    Problem Description Hogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方向. 比如下面的例子里,一开始楼梯在 ...

  9. HDU 2653 (记忆化BFS搜索+优先队列)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2653 题目大意:迷宫中有普通点和陷阱.其中普通点可以走可以飞,但是陷阱只能飞.走耗时1,飞耗时2.但 ...

最新文章

  1. notepad++ 设置常用快捷键
  2. IC/FPGA笔试/面试题分析(十)CMOS门电路
  3. ip route-static 命令的参数
  4. C++中vector使用详细说明 (转)
  5. 从零点五开始用Unity做半个2D战棋小游戏(四)
  6. NLP13-LDA引发的一系活动
  7. path r'c test.html',robot framework - robot命令参数解析
  8. 算法工程师面试备战笔记12_决策树
  9. 7大编程误区,你避开了吗?
  10. html怎么用div从左到右,单独使用CSS,你怎么能有一个从右到左的边框底部渐变?...
  11. MacBook 运维软件
  12. 劝你别把开源的数据分析项目写在简历上了!!!
  13. python 密码生成器
  14. 人生无常,心安便是归处
  15. 【解决】瑞星杀毒软件无法卸载,rising进程无法关闭
  16. 2021年中国房地产贷款情况分析:房地产贷款余额达52.17万亿元,其中个人住房贷款余额占73.45%[图]
  17. [论文阅读]中文版-AlexNet
  18. java毕业设计线上办公工作流系统mybatis+源码+调试部署+系统+数据库+lw
  19. .net refit post请求body 无法序列化[JsonProperty(“A“)]大写
  20. 斯坦福大学计算机排名多少,斯坦福大学全球排名第几

热门文章

  1. 山东科技职业学院计算机考试,【考场考点】山东科技职业学院托福考点详情及考友考评分...
  2. JavaScript 05 — Flex Panels
  3. Yum安装Redis
  4. mysql 常规命令操作_常见的MySQL命令大全
  5. 520运维侠客行·北京站传统IT运维转型之道圆满落幕
  6. python作爱心词云图
  7. Python基础之程序暂停
  8. mysql 存储过程 数字相加_mysql 存储过程 数字相加
  9. Anaconda和ipython环境适配
  10. 传新浪重新涉足网游业 投资国内多家研发公司