HDU 1180 诡异的楼梯 解题报告
2016-09-04 18:10
260 查看
Description
正式开学以后, fish发现在BIT里, 某些楼梯并不是静止不动的,相反, 他们每隔一分钟就变动一次方向.
比如下面的例子里, 一开始楼梯在竖直方向, 一分钟以后它移动到了水平方向,再过一分钟它又回到了竖直方向.fish发现对他来说很难找到能使得他最快到达目的地的路线, 这时uu( fish最好的朋友)告诉fish正好有一个魔法道具可以帮助他寻找这样的路线, 而那个魔法道具上的咒语, 正是由你纂写的.
Input
测试数据有多组,每组的表述如下:
第一行有两个数, M和N, 接下来是一个M行N列的地图,'*' 表示障碍物,'.'表示走廊,'|' 或者'-'表示一个楼梯, 并且标明了它在一开始时所处的位置:'|' 表示的楼梯在最开始是竖直方向,'-'表示的楼梯在一开始是水平方向.地图中还有一个'S'是起点,' T'是目标,0<=M,N<=20,地图中不会出现两个相连的梯子.fish每秒只能停留在'.'或'S'和'T'所标记的格子内.
Output
只有一行, 包含一个数T, 表示到达目标的最短时间.
注意: fish只能每次走到相邻的格子而不能斜走, 每移动一次恰好为一分钟,并且fish登上楼梯并经过楼梯到达对面的整个过程只需要一分钟,fish从来不在楼梯上停留.并且每次楼梯都恰好在fish移动完毕以后才改变方向.
Sample Input
Sample Output
Hint
BFS。求在迷宫中最快到达目的地的方法,显然是BFS搜索。所有楼梯的方向每分钟变化一次,所以奇数分钟和偶数分钟时踏上同一格子是两种情况。因此vis数组可开三维,第三维为0或1表示当前分钟的奇偶性。要注意的是,因为通过楼梯走,可以在一分钟内走两个格子(包括楼梯本身),所以即使当前无法走楼梯,原地等一分钟再走也是划得来的。
正式开学以后, fish发现在BIT里, 某些楼梯并不是静止不动的,相反, 他们每隔一分钟就变动一次方向.
比如下面的例子里, 一开始楼梯在竖直方向, 一分钟以后它移动到了水平方向,再过一分钟它又回到了竖直方向.fish发现对他来说很难找到能使得他最快到达目的地的路线, 这时uu( fish最好的朋友)告诉fish正好有一个魔法道具可以帮助他寻找这样的路线, 而那个魔法道具上的咒语, 正是由你纂写的.
Input
测试数据有多组,每组的表述如下:
第一行有两个数, M和N, 接下来是一个M行N列的地图,'*' 表示障碍物,'.'表示走廊,'|' 或者'-'表示一个楼梯, 并且标明了它在一开始时所处的位置:'|' 表示的楼梯在最开始是竖直方向,'-'表示的楼梯在一开始是水平方向.地图中还有一个'S'是起点,' T'是目标,0<=M,N<=20,地图中不会出现两个相连的梯子.fish每秒只能停留在'.'或'S'和'T'所标记的格子内.
Output
只有一行, 包含一个数T, 表示到达目标的最短时间.
注意: fish只能每次走到相邻的格子而不能斜走, 每移动一次恰好为一分钟,并且fish登上楼梯并经过楼梯到达对面的整个过程只需要一分钟,fish从来不在楼梯上停留.并且每次楼梯都恰好在fish移动完毕以后才改变方向.
Sample Input
5 5
**..T
**.*.
..|..
.*.*.
S....
Sample Output
7
Hint
Hint 地图如下:
BFS。求在迷宫中最快到达目的地的方法,显然是BFS搜索。所有楼梯的方向每分钟变化一次,所以奇数分钟和偶数分钟时踏上同一格子是两种情况。因此vis数组可开三维,第三维为0或1表示当前分钟的奇偶性。要注意的是,因为通过楼梯走,可以在一分钟内走两个格子(包括楼梯本身),所以即使当前无法走楼梯,原地等一分钟再走也是划得来的。
#include<iostream> #include<stdio.h> #include<string.h> #include<queue> #include<stack> #define maxn 25 using namespace std; int m,n; int map[maxn][maxn]; int visited[maxn][maxn][2]; int dir[4][2]={0,1,0,-1,-1,0,1,0}; struct Node { int x,y; int time; }; int main() { while(scanf("%d%d",&m,&n)==2) { int ans=0; struct Node first; queue<Node> q; char w=getchar(); for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { w=getchar(); if(w=='S') { first.x=i; first.y=j; } map[i][j]=w; } getchar(); } first.time=0; memset(visited, 0, sizeof(visited)); q.push(first); while(!q.empty()) { struct Node order,next; order=q.front(); q.pop(); if(map[order.x][order.y]=='T') { ans=order.time; break; } for(int i=0;i<4;i++) { next=order; next.x+=dir[i][0]; next.y+=dir[i][1]; if(next.x<0||next.x>=m||next.y<0||next.y>=n) continue; if(visited[next.x][next.y][next.time%2]) continue; if(map[next.x][next.y]=='*') continue; else if(map[next.x][next.y]=='|') { if((next.time%2==1&&i<=1)||(next.time%2==0&&i>1)) { visited[next.x][next.y][next.time%2]=1; next.x+=dir[i][0]; next.y+=dir[i][1]; }else{ next=order; next.time++; q.push(next); //此处不要push。。不过ac了,我还没测试删去此句后是否ac } } else if(map[next.x][next.y]=='-') { if((next.time%2==1&&i>1)||(next.time%2==0&&i<=1)) { visited[next.x][next.y][next.time%2]=1; next.x+=dir[i][0]; next.y+=dir[i][1]; } else { next=order; next.time++; q.push(next); //此处不要push。。不过ac了,我还没测试删去此句后是否ac } } if(next.x<0||next.x>=m||next.y<0||next.y>=n) continue; if(visited[next.x][next.y][next.time%2]) continue; if(map[next.x][next.y]=='*') continue; visited[next.x][next.y][next.time%2]=1; next.time++; q.push(next); } } printf("%d\n",ans); } return 0; }
相关文章推荐
- hdu 1180 诡异的楼梯 bfs+优先队列 解题报告
- HDU-1180 诡异的楼梯 BFS+优先队列
- hdu 1180 诡异的楼梯
- HDU 1180 诡异的楼梯
- hdu 1180 诡异的楼梯(bfs+优先队列)
- hdu1180——诡异的楼梯
- hdu 1180 诡异的楼梯 bfs
- HDU 1180 诡异的楼梯
- hdu 1180 诡异的楼梯 楼梯可以变方向的搜索题
- [HDU] 1180 诡异的楼梯-个人觉得比较有趣的广搜索
- HDU 1180 诡异的楼梯(优先队列)
- HDU 1180 诡异的楼梯【广搜】
- HDU:2041上楼梯问题解题报告
- hdu 1180 诡异的楼梯 BFS+优先队列
- 方向搜索hdu 1180 诡异的楼梯 楼梯可以变方向的搜索题
- hdu 1180(诡异的楼梯)
- 【搜索之BFS + 优先队列】杭电 hdu 1180 诡异的楼梯
- HDU 1180 诡异楼梯 bfs
- hdu 1180 诡异的楼梯
- HDU 1180 诡异的楼梯