这篇代码借鉴的其他大神的,代码风格十分整洁,思路清晰,没有多余的冗长的代码,甚至连括号都没法删减,这让我对逐渐养成一个
规范的代码书写格式有了重新的认识
C - 诡异的楼梯
Crawling in process...
Crawling failed
Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u
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
Hint
Hint 地图如下:
ac代码:
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; const int M=25; const int inf=1<<30; const char road='.'; const char t1='|'; const char t2='-'; const char start='S'; const char endd='T'; const char obstacle='*'; const char inqueue='#'; char map[M][M]; int n,m; int revise[][2]={{-1,0},{0,1},{1,0},{0,-1}}; struct p { int x,y,minite; p(int x=-1,int y=-1):x(x),y(y){minite=0;} }s; int BFS() { queue<p>que; que.push(s); while(!que.empty()) { p now=que.front();que.pop(); if(endd==map[now.x][now.y])return now.minite;//找到终点 map[now.x][now.y]=obstacle; for(int i=0;i<4;i++)//四个方向 { int next_x=revise[i][0]+now.x; int next_y=revise[i][1]+now.y; if(next_x>=0&&next_x<n&&next_y>=0&&next_y<m)//没有出界 { if(map[next_x][next_y]==obstacle)continue; else if(map[next_x][next_y]==road||map[next_x][next_y]==endd)//如果是路或者是终点 { p next=p(next_x,next_y); next.minite=now.minite+1; (map[next_x][next_y]!=endd)?(map[next_x][next_y]=inqueue):(1); que.push(next); } else if(map[next_x][next_y]==t1||map[next_x][next_y]==t2) //如果是梯子 { if((1==1||3==i)&&(map[now.x][now.y+revise[i][1]*2]!=obstacle))//左右方向移动 {if(now.y+revise[i][1]*2>=0&&now.y+revise[i][1]*2<m)//没有出界 { if((map[next_x][next_y]==t1&&now.minite%2==1)||(map[next_x][next_y]==t2&&now.minite%2==0))//梯子恰好能过去 { p next=p(now.x,now.y+revise[i][1]*2); next.minite=now.minite+1; que.push(next); } else//暂时不能过去 { p next=p(now.x,now.y); next.minite=now.minite+1; que.push(next); }}} else if((i==0||i==2)&&(map[now.x+revise[i][0]*2][now.y]!=obstacle))//上下方向移动 {if(now.x+revise[i][0]*2>=0&&now.x+revise[i][0]*2<n)//没有出界 {if((map[next_x][next_y]==t1&&now.minite%2==0)||(map[next_x][next_y]==t2&&now.minite%2==1))//梯子恰好能过去 { p next=p(now.x+revise[i][0]*2,now.y); next.minite=now.minite+1; que.push(next); } else//暂时不能过去 { p next=p(now.x,now.y); next.minite=now.minite+1; que.push(next); } }}} } } }return 0; } int main() { while(scanf("%d %d",&n,&m)!=EOF) { getchar(); for(int i=0;i<n;i++) {for(int j=0;j<m;j++) {scanf("%c",&map[i][j]);if(start==map[i][j])s=p(i,j);}getchar();} printf("%d\n",BFS()); } return 0; }