诡异的楼梯
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 13124 Accepted Submission(s): 3297
Problem Description
Hogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方向.
比如下面的例子里,一开始楼梯在竖直方向,一分钟以后它移动到了水平方向,再过一分钟它又回到了竖直方向.Harry发现对他来说很难找到能使得他最快到达目的地的路线,这时Ron(Harry最好的朋友)告诉Harry正好有一个魔法道具可以帮助他寻找这样的路线,而那个魔法道具上的咒语,正是由你纂写的.
比如下面的例子里,一开始楼梯在竖直方向,一分钟以后它移动到了水平方向,再过一分钟它又回到了竖直方向.Harry发现对他来说很难找到能使得他最快到达目的地的路线,这时Ron(Harry最好的朋友)告诉Harry正好有一个魔法道具可以帮助他寻找这样的路线,而那个魔法道具上的咒语,正是由你纂写的.
Input
测试数据有多组,每组的表述如下:
第一行有两个数,M和N,接下来是一个M行N列的地图,'*'表示障碍物,'.'表示走廊,'|'或者'-'表示一个楼梯,并且标明了它在一开始时所处的位置:'|'表示的楼梯在最开始是竖直方向,'-'表示的楼梯在一开始是水平方向.地图中还有一个'S'是起点,'T'是目标,0<=M,N<=20,地图中不会出现两个相连的梯子.Harry每秒只能停留在'.'或'S'和'T'所标记的格子内.
第一行有两个数,M和N,接下来是一个M行N列的地图,'*'表示障碍物,'.'表示走廊,'|'或者'-'表示一个楼梯,并且标明了它在一开始时所处的位置:'|'表示的楼梯在最开始是竖直方向,'-'表示的楼梯在一开始是水平方向.地图中还有一个'S'是起点,'T'是目标,0<=M,N<=20,地图中不会出现两个相连的梯子.Harry每秒只能停留在'.'或'S'和'T'所标记的格子内.
Output
只有一行,包含一个数T,表示到达目标的最短时间.
注意:Harry只能每次走到相邻的格子而不能斜走,每移动一次恰好为一分钟,并且Harry登上楼梯并经过楼梯到达对面的整个过程只需要一分钟,Harry从来不在楼梯上停留.并且每次楼梯都恰好在Harry移动完毕以后才改变方向.
注意:Harry只能每次走到相邻的格子而不能斜走,每移动一次恰好为一分钟,并且Harry登上楼梯并经过楼梯到达对面的整个过程只需要一分钟,Harry从来不在楼梯上停留.并且每次楼梯都恰好在Harry移动完毕以后才改变方向.
Sample Input
5 5 **..T **.*. ..|.. .*.*. S....
Sample Output
7地图如下:HintHint![]()
题目代码:#include <iostream> #include <stdio.h> #include <queue> #include <string.h> using namespace std; ///四个搜索方向上右下左 int dir[4][2] = {{-1,0},{0,1},{1,0},{0,-1}}; int M,N; ///M行N列 char Map[30][30]; int vis[30][30]; int sx,sy,ex,ey; struct Node { int x,y,step; }; int judge(int x,int y,int step,int i) { int x1 = x + dir[i][0]; int y1 = y + dir[i][1]; ///先判断楼梯对面有没有到过 if(Map[x1][y1]=='*' || vis[x1][y1] == 1 || x1<=0 || x1>M || y1<=0 || y1>N) return -1; int time = 0; if(step % 2 == 0) ///到达楼梯前一步是偶数步,楼梯状态保持不变 { if(Map[x][y] == '|') ///楼梯是竖着的 { if(dir[i][0]==0) ///现在在水平方向上 time++; } else { if(dir[i][1]==0) time++; } } else { if(Map[x][y]=='|') ///楼梯是横着的 { if(dir[i][1]==0) ///在竖直方向等待一秒 time++; } if(Map[x][y]=='-') { if(dir[i][0] == 0) time++; } } return time+1; ///总要花费一秒的。 } int bfs() { memset(vis,0,sizeof(vis)); Node cur,nex; queue<Node>qu; cur.x = sx; cur.y = sy; cur.step = 0; vis[sx][sy] = 1; qu.push(cur); while(!qu.empty()) { cur = qu.front(); qu.pop(); if(cur.x == ex && cur.y == ey) return cur.step; for(int i = 0; i < 4; i++) { nex.x = cur.x + dir[i][0]; nex.y = cur.y + dir[i][1]; if(nex.x>0&&nex.x<=M&&nex.y>0&&nex.y<=N&&vis[nex.x][nex.y]==0&&Map[nex.x][nex.y]!='*') { if(Map[nex.x][nex.y]=='.' || Map[nex.x][nex.y]=='T') { vis[nex.x][nex.y] = 1; nex.step = cur.step + 1; qu.push(nex); } else if(Map[nex.x][nex.y] == '|' || Map[nex.x][nex.y] == '-') { int num = judge(nex.x,nex.y,cur.step,i); if(num == -1) continue; nex.x = nex.x + dir[i][0]; nex.y = nex.y + dir[i][1]; nex.step = cur.step + num; vis[nex.x][nex.y] = 1; qu.push(nex); } } } } return -1; } int main() { while(~scanf("%d%d",&M,&N)) { for(int i= 1; i <= M; i++) for(int j = 1; j <= N; j++) { scanf(" %c",&Map[i][j]); if(Map[i][j] == 'S') { sx = i; sy = j; } if(Map[i][j] == 'T') { ex = i; ey = j; } } int ans = bfs(); printf("%d\n",ans); } return 0; }