hdu 诡异的楼梯(BFS)
比如下面的例子里,一开始楼梯在竖直方向,一分钟以后它移动到了水平方向,再过一分钟它又回到了竖直方向.Harry发现对他来说很难找到能使得他最快到达目的地的路线,这时Ron(Harry最好的朋友)告诉Harry正好有一个魔法道具可以帮助他寻找这样的路线,而那个魔法道具上的咒语,正是由你纂写的.
第一行有两个数,M和N,接下来是一个M行N列的地图,'*'表示障碍物,'.'表示走廊,'|'或者'-'表示一个楼梯,并且标明了它在一开始时所处的位置:'|'表示的楼梯在最开始是竖直方向,'-'表示的楼梯在一开始是水平方向.地图中还有一个'S'是起点,'T'是目标,0<=M,N<=20,地图中不会出现两个相连的梯子.Harry每秒只能停留在'.'或'S'和'T'所标记的格子内.
注意:Harry只能每次走到相邻的格子而不能斜走,每移动一次恰好为一分钟,并且Harry登上楼梯并经过楼梯到达对面的整个过程只需要一分钟,Harry从来不在楼梯上停留.并且每次楼梯都恰好在Harry移动完毕以后才改变方向.
Hint
地图如下:
思路:
#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.*.
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)相关推荐
- 诡异的楼梯 bfs
诡异的楼梯 原题链接https://vjudge.net/contest/345248#problem/M 由题意可知,题目大概还是一个迷宫问题,大概思路不变,但是需要增加情况,对于到楼梯前的时候我们 ...
- HDU 1180 诡异的楼梯(超级经典的bfs之一,需多回顾)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1180 诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others) ...
- hdu1180 诡异的楼梯(BFS+优先队列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1180 诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others) ...
- HDU 1180 诡异的楼梯
诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Sub ...
- HDU 1180 诡异的楼梯
诡异的楼梯 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) Total Submis ...
- 【算法设计与分析】HDU-1108 C++诡异的楼梯(BFS迷宫最短路径)
一.题目描述 Problem Description Hogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方向. 比如下面的例子里 ...
- HDU - 1495 非常可乐(BFS,数学)
HDU - 1495 非常可乐(BFS,数学) 巨佬的数学解法 #include<iostream> using namespace std; int gcd(int a,int b) { ...
- HDOJ/HDU 1180 诡异的楼梯(经典BFS-详解)
Problem Description Hogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方向. 比如下面的例子里,一开始楼梯在 ...
- HDU 2653 (记忆化BFS搜索+优先队列)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2653 题目大意:迷宫中有普通点和陷阱.其中普通点可以走可以飞,但是陷阱只能飞.走耗时1,飞耗时2.但 ...
最新文章
- notepad++ 设置常用快捷键
- IC/FPGA笔试/面试题分析(十)CMOS门电路
- ip route-static 命令的参数
- C++中vector使用详细说明 (转)
- 从零点五开始用Unity做半个2D战棋小游戏(四)
- NLP13-LDA引发的一系活动
- path r'c test.html',robot framework - robot命令参数解析
- 算法工程师面试备战笔记12_决策树
- 7大编程误区,你避开了吗?
- html怎么用div从左到右,单独使用CSS,你怎么能有一个从右到左的边框底部渐变?...
- MacBook 运维软件
- 劝你别把开源的数据分析项目写在简历上了!!!
- python 密码生成器
- 人生无常,心安便是归处
- 【解决】瑞星杀毒软件无法卸载,rising进程无法关闭
- 2021年中国房地产贷款情况分析:房地产贷款余额达52.17万亿元,其中个人住房贷款余额占73.45%[图]
- [论文阅读]中文版-AlexNet
- java毕业设计线上办公工作流系统mybatis+源码+调试部署+系统+数据库+lw
- .net refit post请求body 无法序列化[JsonProperty(“A“)]大写
- 斯坦福大学计算机排名多少,斯坦福大学全球排名第几