这题做了很久
做好了感觉很简单。。。 现在做题思路更加清晰了
一个要点就是 当楼梯过不去的时候不能是先过去时间加2 必须得回去等一秒 否则queue的时间顺序会被打破
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include<bits/stdc++.h> using namespace std; int sx,sy,ex,ey;int n,m; char m1[31][31]; bool f[31][31]; struct node { int x,y,d; node(int x=0,int y=0,int d=0):x(x),y(y),d(d){} }; void bfs() { memset(f,false,sizeof(f)); int dx[4]={0,1,0,-1}; int dy[4]={1,0,-1,0}; node u(sx,sy,0); queue<node>q; q.push(u); while(!q.empty()) { u=q.front();q.pop(); // printf("%d %d %d\n",u.x,u.y,u.d); if(u.x==ex&&u.y==ey){printf("%d\n",u.d);return;} for(int i=0;i<4;i++) { node v(u.x+dx[i],u.y+dy[i],u.d+1); if(v.x>=1&&v.x<=n&&v.y>=1&&v.y<=m&&m1[v.x][v.y]!='*') { if(m1[v.x][v.y]=='|') { if(i==0||i==2)//shuiping { if(v.d%2==1&&f[v.x+dx[i]][v.y+dy[i]]==false){v.x-=dx[i];v.y-=dy[i];q.push(v);} else if (v.d%2==0&&f[v.x+dx[i]][v.y+dy[i]]==false){v.x+=dx[i];v.y+=dy[i];q.push(v);} } if(i==1||i==3) { if(v.d%2==1&&f[v.x+dx[i]][v.y+dy[i]]==false){v.x+=dx[i];v.y+=dy[i];f[v.x][v.y]=true;q.push(v);} else if (v.d%2==0&&f[v.x+dx[i]][v.y+dy[i]]==false){v.x-=dx[i];v.y-=dy[i];q.push(v);} } } if(m1[v.x][v.y]=='-') { if(i==0||i==2)//shuiping { if(v.d%2==1&&f[v.x+dx[i]][v.y+dy[i]]==false){v.x+=dx[i];v.y+=dy[i];q.push(v);} else if (v.d%2==0&&f[v.x+dx[i]][v.y+dy[i]]==false){v.x-=dx[i];v.y-=dy[i];q.push(v);} } if(i==1||i==3) { if(v.d%2==1&&f[v.x+dx[i]][v.y+dy[i]]==false){v.x-=dx[i];v.y-=dy[i];q.push(v);} else if (v.d%2==0&&f[v.x+dx[i]][v.y+dy[i]]==false){v.x+=dx[i];v.y+=dy[i];f[v.x][v.y]=true;q.push(v);} } } else if(f[v.x][v.y]==false&&(m1[v.x][v.y]=='.'||v.x==ex&&v.y==ey)) { f[v.x][v.y]=true;q.push(v); } } } } } int main() { while(scanf("%d%d",&n,&m)==2) { for(int i=1;i<=n;i++) { scanf("%s",m1[i]+1); for(int j=1;j<=m;j++) { if(m1[i][j]=='S'){sx=i;sy=j;} if(m1[i][j]=='T'){ex=i;ey=j;} } } // printf("%d %d %d %d\n",sx,sy,ex,ey); bfs(); //printf("pl"); } return 0; }