hdu1180——诡异的楼梯(优先队列+bfs)
2017-03-19 14:12
232 查看
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
HintHint
地图如下:
Harry登上楼梯并经过楼梯到达对面的整个过程只需要一分钟,Harry从来不在楼梯上停留.并且每次楼梯都恰好在Harry移动完毕以后才改变方向.
如果当前位置在楼梯,时间不加1。如果是偶数步,楼梯状态不会改变,可以只花1的时间穿过楼梯,到对面。如果是奇数步,则需要多花1的等待时间,去等待楼梯状态改变。
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
HintHint
地图如下:
Harry登上楼梯并经过楼梯到达对面的整个过程只需要一分钟,Harry从来不在楼梯上停留.并且每次楼梯都恰好在Harry移动完毕以后才改变方向.
如果当前位置在楼梯,时间不加1。如果是偶数步,楼梯状态不会改变,可以只花1的时间穿过楼梯,到对面。如果是奇数步,则需要多花1的等待时间,去等待楼梯状态改变。
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #define N 30 /* run this program using the console pauser or add your own getch, system("pause") or input loop */ using namespace std; char map ; int vis ; int dx[]={1,-1,0,0},dy[]={0,0,1,-1}; int n,m,sx,sy,ex,ey; struct Node { int x,y,step; friend bool operator <(const Node a,const Node b) { return a.step>b.step; } }p,q; bool check(Node k) { if(k.x<0||k.x>=n||k.y<0||k.y>=m||vis[k.x][k.y]||map[k.x][k.y]=='*') return false; return true; } int bfs() { priority_queue<Node> Q;//优先队列 p.x=sx,p.y=sy,p.step=0; vis[sx][sy]=1; Q.push(p); while(!Q.empty()) { p=Q.top(); Q.pop(); for(int i=0;i<4;i++) { q=p; q.x+=dx[i]; q.y+=dy[i]; q.step++;//Harry只能每次走到相邻的格子而不能斜走,每移动一次恰好为一分钟, if(check(q)&&(map[q.x][q.y]=='|'||map[q.x][q.y]=='-')) { char ch=map[q.x][q.y]; if(q.step&1)//判断当前楼梯的方向 { if(ch=='|') ch='-'; else ch='|'; } q.x+=dx[i]; q.y+=dy[i]; if((ch=='|'&&(i==0||i==1))||(ch=='-'&&(i==2||i==3))) //只有奇数步才会有这样的情况 { q.step++;//Harry登上楼梯并经过楼梯到达对面的整个过程只需要一分钟, } } if(check(q)) { if(q.x==ex&&q.y==ey)//走到了终点 { return q.step; } vis[q.x][q.y]=1; Q.push(q); } } } return -1; } int main(int argc, char *argv[]) { while(~scanf("%d%d",&n,&m)) { memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) { scanf("%s",map[i]); for(int j=0;j<m;j++) { if(map[i][j]=='S') sx=i,sy=j; if(map[i][j]=='T') ex=i,ey=j; } } printf("%d\n",bfs()); } return 0; }
相关文章推荐
- hdu1180 诡异的楼梯(优先队列bfs)
- HDU 1180 诡异的楼梯(搜索 -- BFS)
- HDU 1180 诡异的楼梯(BFS+保存自己的状态)
- HDU1180 诡异的楼梯 广搜 优先队列
- 【Bfs】HDU 1180 诡异的楼梯
- hdu1180诡异的楼梯【优先队列+广搜】
- hdu 1180 诡异的楼梯 bfs+优先队列 解题报告
- hdu 1180 诡异的楼梯 (bfs)
- hdu 1180 诡异的楼梯 (BFS)
- HDU 1180 诡异的楼梯 BFS
- hdu 1180 诡异的楼梯 bfs
- 【BFS&&优先队列】HDU 1180 诡异的楼梯
- hdu 1180 诡异的楼梯(BFS)
- HDU 1180:诡异的楼梯(BFS)
- HDU 1180——诡异的楼梯( BFS)
- hdu 1180 诡异的楼梯【BFS+优先队列】
- HDU 1180 诡异的楼梯 (BFS)
- HDU 1180 诡异的楼梯(优先队列)
- hdu 1180 诡异的楼梯 BFS 这题相当坑爹啊,需要注意几点
- HDU 1180 诡异的楼梯(BFS,用优先队列过)