诡异的楼梯
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 9588 Accepted Submission(s): 2360
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 地图如下:
Hint
Hint
Source
PS:找出Bug的时候感觉自己都他妈虚脱了,dir判断方向出错,欲哭无泪啊啊啊啊啊啊啊啊
1 //题目容易出错的问题 2 //1.在方向判断上 3 //2.通过不需要耗费时间 4 //3.当不允许通过时,可等一分钟后通过 5 //4.通过的地方不需要判重 6 #include7 #include 8 #include 9 #include 10 #include 11 #include 12 using namespace std; 13 int xi,yj; 14 int m,n; 15 int dir[4][2]={ { 0,1},{ 0,-1},{-1,0},{ 1,0}};//右左上下,就是这的问题,代表加完之后的走向 16 char map[25][25]; 17 int vis[25][25]; 18 struct ln{ 19 int x; 20 int y; 21 int t; 22 }abc,q; 23 24 bool check(int x,int y)//判断是否越界 25 { 26 if(x>=1&&x<=m && y>=1&&y<=n && map[x][y]!='*' && vis[x][y]==0) 27 return true; 28 return false; 29 } 30 31 int bfs() 32 { 33 int i; 34 int xx,yy; 35 int xxx,yyy; 36 queue p; 37 memset(vis,0,sizeof(vis));//标记初始化 38 abc.x=xi; 39 abc.y=yj; 40 abc.t=0; 41 vis[abc.x][abc.y]=1; 42 p.push(abc); 43 while(!p.empty()) 44 { 45 abc=p.front(); 46 p.pop(); 47 if(map[abc.x][abc.y]=='T') 48 return abc.t; 49 for(i=0;i<4;i++) 50 { 51 xx=abc.x+dir[i][0]; 52 yy=abc.y+dir[i][1]; 53 if(check(xx,yy)==false) 54 continue; 55 if(map[xx][yy]=='T' || map[xx][yy]=='.') 56 { 57 q.x=xx; 58 q.y=yy; 59 q.t=abc.t+1; 60 vis[q.x][q.y]=1; 61 p.push(q); 62 } 63 if(i>=2&&i<4)//上下 64 { 65 if( (map[xx][yy]=='|'&&abc.t%2==0) || (map[xx][yy]=='-'&&abc.t%2!=0) ) 66 { 67 xxx=xx+dir[i][0]; 68 yyy=yy+dir[i][1]; 69 if(!check(xxx,yyy)) 70 continue; 71 else 72 { 73 q.x=xxx; 74 q.y=yyy; 75 q.t=abc.t+1; 76 vis[q.x][q.y]=1; 77 p.push(q); 78 } 79 } 80 else//即便此时无法通过,也可等1分钟后再过,所以需要重新压入 81 { 82 q.x=abc.x; 83 q.y=abc.y; 84 q.t=abc.t+1; 85 p.push(q); 86 } 87 } 88 else if(i<2)//左右 89 { 90 if( (map[xx][yy]=='-'&&abc.t%2==0) || (map[xx][yy]=='|'&&abc.t%2!=0) ) 91 { 92 xxx=xx+dir[i][0]; 93 yyy=yy+dir[i][1]; 94 if(!check(xxx,yyy)) 95 continue; 96 else 97 { 98 q.x=xxx; 99 q.y=yyy;100 q.t=abc.t+1;101 vis[q.x][q.y]=1;102 p.push(q);103 }104 }105 else//即便此时无法通过,也可等1分钟后再过,所以需要重新压入106 {107 q.x=abc.x;108 q.y=abc.y;109 q.t=abc.t+1;110 p.push(q);111 }112 }113 }114 }115 return 0;116 }117 118 int main()119 {120 //freopen("in.txt","r",stdin);121 while(~scanf("%d%d",&m,&n))122 {123 int i,j;124 for(i=1;i<=m;i++)125 {126 getchar();127 for(j=1;j<=n;j++)128 {129 scanf("%c",&map[i][j]);130 if(map[i][j]=='S')131 {132 xi=i;133 yj=j;134 }135 }136 }137 int count;138 count=bfs();139 printf("%d\n",count);140 141 }142 return 0;143 }