愤啊。。。居然不过,火了。。。等哪天我乐意了,再自己A 贴上复制代码: #include<iostream> #include<queue> using namespace std; int dir[4][2]={0,1,1,0,0,-1,-1,0}; int m,n,ai,bi,ci,di; char map[21][21]; int visited[21][21]; struct node { int x,y; int time; }; int check(int a,int b) { if(a>=0&&a<m&&b>=0&&b<n&&!visited[a][b]) return 1; return 0; } int loucheck(int a,int b,int c,int d,int step) { if(c>=0&&c<m&&d>=0&&d<n&&!visited[c][d]) { if(map[a][b]=='|') { if(d==b) // 竖着过来 { if(step%2==0) return 1; else return 0; } else // 横着过来 { if(step%2) return 1; else return 0; } } else { if(b==d) { if(step%2) return 1; else return 0; } else { if(step%2==0) return 1; else return 0; } } } return 0; } void bfs() { int i; queue<node>Q; struct node p,q,key; memset(visited,0,sizeof(visited)); p.x=ai; p.y=bi; p.time=0; Q.push(p); visited[ai][bi]=1; while(!Q.empty()) { q=Q.front(); for(i=0;i<4;i++) { key.x=q.x+dir[i][0]; key.y=q.y+dir[i][1]; if(map[key.x][key.y]!='*'&&check(key.x,key.y)) { if(map[key.x][key.y]=='T') { cout<<q.time+1<<endl; return; } if(map[key.x][key.y]=='.') { visited[key.x][key.y]=1; key.time=q.time+1; Q.push(key); } else if(map[key.x][key.y]=='|'||map[key.x][key.y]=='-') { p.x=key.x+dir[i][0]; p.y=key.y+dir[i][1]; if(loucheck(key.x,key.y,p.x,p.y,q.time)) // 注意这里要把楼梯前一点的时间传进函数判断 { p.time=q.time+1; visited[p.x][p.y]=1; if(map[p.x][p.y]=='T') // 楼梯过去的那一点也要判断是否就是终点了,否则要在每次取队头元素的时候加判断一次 { cout<<p.time<<endl; return; } Q.push(p); } else if(check(p.x,p.y)) // 如果不能过楼梯,就在当前一点再入队一次,注意时间要加一 { p.x=q.x; p.y=q.y; p.time=q.time+1; visited[p.x][p.y]=1; Q.push(p); } } } } Q.pop(); } } int main() { while(cin>>m>>n) { // memset(map,'*',sizeof(map)); int i,j; for(i=0;i<m;i++) for(j=0;j<n;j++) { cin>>map[i][j]; if(map[i][j]=='S') { ai=i; bi=j; } } bfs(); } return 0; } 顺便贴上WA的代码: #include<stdio.h> #include<string.h> #define max 1005 char g[max][max]; int dir[][2]={{0,-1},{0,1},{-1,0},{1,0}}; int n,m; bool vis[max][max]; struct node { int x,y; int time; }s; bool find(int x,int y) { if(x>=0&&x<m&&y>=0&&y<n&&vis[x][y]) return true; return false; } bool abs(int a) { if(a>=0)return a; return -a; } bool check(int x,int y,struct node p,struct node temp) { if(p.x>=0&&p.x<m&&p.y>=0&&p.y<n&&vis[p.x][p.y]) { if(g[p.x][p.y]=='|') { if(temp.time %2==0&&!abs(p.y-y)) return true; else if(temp.time %2!=0&&!abs(p.x-x)) return true; } else if(g[p.x][p.y]=='-') { if(temp.time %2==0&&!abs(p.x-x)) return true; if(temp.time %2!=0&&!abs(p.y-y)) return true; } } return false; } void bfs() { struct node queue[2000],p,q,key; int front=0,rear=0,i; rear++; queue[rear].x=s.x;queue[rear].y=s.y;queue[rear].time =0; memset(vis,true,sizeof(vis)); vis[s.x][s.y]=false; while(front!=rear) { front++; q=queue[front]; for(i=0;i<4;i++) { key.x=q.x+dir[i][0]; key.y=q.y+dir[i][1]; if(find(key.x,key.y)&&g[key.x][key.y]!='*') { if(g[key.x][key.y]=='T') { printf("%d/n",q.time); return ; } if(g[key.x][key.y]=='.') { vis[key.x][key.y]=false; key.time =q.time +1; rear++;queue[rear]=key; } if(g[key.x][key.y]=='|'||g[key.x][key.y]=='-') { p.x=key.x+dir[i][0];p.y=key.y+dir[i][1]; if(check(key.x,key.y,p,q)) { p.time=q.time+1; vis[p.x][p.y]=false; if(g[p.x][p.y]=='T') { printf("%d/n",p.time ); return; } rear++;queue[rear]=p; } else { p.x=q.x; p.y=q.y; p.time=q.time+1; vis[p.x][p.y]=false; rear++;queue[rear]=p; } } } } } } int main() { int i,j; scanf("%d%d",&n,&m); for(i=0;i<n;i++) { scanf("%s",&g[i]); for(j=0;j<m;j++) if(g[i][j]=='S') { s.x=i;s.y=j; } } bfs(); return 0; }