时间数组标记是否将遇到的位置进队列即可,应该用优先队列也是可以的,不过麻烦。
#include <iostream> #include <queue> #include <cstring> using namespace std; struct point { int x,y,step; }s,e; queue<point> q; int n,m,tim[25][25]; char map[25][25]; int h[4][2]={1,0,-1,0,0,1,0,-1}; int BFS() { while(!q.empty()) q.pop(); int i,j,xx,yy,shu; point t,tt; q.push(s);tim[s.x][s.y]=0; while(!q.empty()) { t=q.front(); q.pop(); for(i=0;i<4;i++) { xx=t.x+h[i][0]; yy=t.y+h[i][1]; if(xx>=0&&xx<n&&yy>=0&&yy<m&&map[xx][yy]!='*') { tt.step=t.step+1; if(map[xx][yy]=='|') { xx=xx+h[i][0]; yy=yy+h[i][1]; //对达楼梯对面 if(xx>=0&&xx<n&&yy>=0&&yy<m&&map[xx][yy]!='*') //楼梯前面还有路 { if(t.step%2!=0&&i<=1||t.step%2==0&&i>1) tt.step+=1; if(tt.step<tim[xx][yy]) { tt.x=xx; tt.y=yy; q.push(tt); tim[xx][yy]=tt.step; } } } else if(map[xx][yy]=='-') { xx=xx+h[i][0]; yy=yy+h[i][1]; //到达楼梯对面 if(xx>=0&&xx<n&&yy>=0&&yy<m&&map[xx][yy]!='*') //楼梯前面还有路 { if(t.step%2!=0&&i>1||t.step%2==0&&i<=1) tt.step+=1; if(tt.step<tim[xx][yy]) { tt.x=xx; tt.y=yy; q.push(tt); tim[xx][yy]=tt.step; } } } else { if(tt.step<tim[xx][yy]) { tt.x=xx; tt.y=yy; q.push(tt); tim[xx][yy]=tt.step; } } } } } return tim[e.x][e.y]; } int main(int argc, char *argv[]) { int i,j; while(cin>>n>>m) { for(i=0;i<n;i++) for(j=0;j<m;j++) { cin>>map[i][j]; if(map[i][j]=='S') { s.x=i; s.y=j; s.step=0; tim[i][j]=0; } else if(map[i][j]=='T') { e.x=i; e.y=j; } } memset(tim,0x33,sizeof(tim)); cout<<BFS()<<endl; } return 0; }