题目链接~~>
这题其实很简单,在走楼梯时只要判断是否能走就可以,如果不能走,可以选择等下一分钟再走,还有一点就是楼梯不能标记,可以从不同方向过。
代码:
#include<stdio.h> #include<queue> using namespace std ; int dx[4]={-1,1,0,0},dy[4]={0,0,1,-1} ; char s[25][25] ; int m,n ; struct zhang { int x,y,bu ; } ; int bfs(int x,int y) { queue<zhang>q ; zhang current,next ; int sx,sy ; current.x=x ; current.y=y ; s[x][y]='*' ; current.bu=0 ; q.push(current) ; while(!q.empty()) { current=q.front() ; q.pop() ; for(int i=0;i<4;i++) { next.x=current.x+dx[i] ; next.y=current.y+dy[i] ; if(next.x>=0&&next.x<n&&next.y>=0&&next.y<m&&s[next.x][next.y]!='*') { next.bu=current.bu+1 ; sx=next.x+dx[i] ; sy=next.y+dy[i] ; if(s[next.x][next.y]=='|'&&s[sx][sy]!='*') { if(current.bu%2&&(i==3||i==2)) { next.x=sx ; next.y=sy ; if(s[sx][sy]=='T') return next.bu ; s[sx][sy]='*' ; q.push(next) ; } else if(current.bu%2==0&&(i==0||i==1)) { next.x=sx ; next.y=sy ; if(s[sx][sy]=='T') return next.bu ; s[sx][sy]='*' ; q.push(next) ; } else { next.x=current.x ; next.y=current.y ; q.push(next) ; } } else if(s[next.x][next.y]=='-'&&s[sx][sy]!='*') { if(current.bu%2==0&&(i==3||i==2)) { next.x=sx ; next.y=sy ; if(s[sx][sy]=='T') return next.bu ; s[sx][sy]='*' ; q.push(next) ; } else if(current.bu%2==1&&(i==0||i==1)) { next.x=sx ; next.y=sy ; if(s[sx][sy]=='T') return next.bu ; s[sx][sy]='*' ; q.push(next) ; } else { next.x=current.x ; next.y=current.y ; q.push(next) ; } } else if(s[next.x][next.y]=='.') { s[next.x][next.y]='*' ; q.push(next) ; } else if(s[next.x][next.y]=='T') return next.bu ; } } } return -1 ; } int main() { int i,j,ax,ay ; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<n;i++) { scanf("%s",s[i]) ; for(j=0;j<m;j++) if(s[i][j]=='S') { ax=i ; ay=j ; } } printf("%d\n",bfs(ax,ay)) ; } return 0 ; }