本题与简单B模板BFS题的区别就在于对楼梯的处理。这值得注意的一点就是要考虑等楼梯的情况。
因为这种情况的存在,因此采用优先队列保证得到的时间是最小的。
具体对楼梯的处理体现在代码中。
#include<iostream> #include<stdio.h> #include<cstring> #include<algorithm> #include<vector> #include<math.h> #include<queue> #include<stack> using namespace std; char map[1001][1001]; int vis[1001][1001]; int n,m,sx,sy,ex,ey; int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1},}; bool legal(int x,int y) { if(x<1||y<1||x>n||y>m||vis[x][y]||map[x][y]=='*') return false; return true; } struct node { int x,y,t; }; struct cmp { bool operator()(node a,node b) { return a.t>b.t; } }; int bfs() { memset(vis,0,sizeof(vis)); node cur,next; cur.x=sx; cur.y=sy; cur.t=0; priority_queue<node,vector<node>,cmp> q; q.push(cur); while(!q.empty()) { cur=q.top(); q.pop(); if(cur.x==ex&&cur.y==ey) return cur.t; for(int i=0;i<4;i++) { next.x=cur.x+dir[i][0]; next.y=cur.y+dir[i][1]; next.t=cur.t+1; while(legal(next.x,next.y)) { if((i==0||i==1)&&map[next.x][next.y]=='|'&&cur.t%2==0) next.x=next.x+dir[i][0]; else if((i==0||i==1)&&map[next.x][next.y]=='-'&&cur.t%2==0) { next.x=next.x+dir[i][0]; next.t=next.t+1; } else if((i==0||i==1)&&map[next.x][next.y]=='-'&&cur.t%2==1) next.x=next.x+dir[i][0]; else if((i==0||i==1)&&map[next.x][next.y]=='|'&&cur.t%2==1) { next.x=next.x+dir[i][0]; next.t=next.t+1; } else if((i==2||i==3)&&map[next.x][next.y]=='|'&&cur.t%2==1) next.y=next.y+dir[i][1]; else if((i==2||i==3)&&map[next.x][next.y]=='|'&&cur.t%2==0) { next.y=next.y+dir[i][1]; next.t=next.t+1; } else if((i==2||i==3)&&map[next.x][next.y]=='-'&&cur.t%2==0) next.y=next.y+dir[i][1]; else if((i==2||i==3)&&map[next.x][next.y]=='-'&&cur.t%2==1) { next.y=next.y+dir[i][1]; next.t=next.t+1; } vis[next.x][next.y]=1; q.push(next); } } } } int main() { while(cin>>n>>m) { for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { cin>>map[i][j]; if(map[i][j]=='S') { sx=i; sy=j; map[i][j]='*'; } if(map[i][j]=='T') { ex=i; ey=j; } } cout<<bfs()<<endl; } return 0; }