题目解析:对于楼梯来说,不进行 标记,当到达楼梯时,如果可以走并且跨过楼梯之后的点也可以走,那么就走楼梯,否则的话,就等一分钟,即当前节点的时间加1然后 加入队列,其他的就跟一本的搜索一样了。
代码如下;
#include<stdio.h> #include<string.h> #include<queue> using namespace std; struct node { int x; int y; int time; }; char map[23][23]; int vis[23][23]; int m,n,a,b; int dx[5]={1,-1,0,0}; int dy[5]={0,0,1,-1}; void bfs() { memset(vis,0,sizeof(vis)); node node1,node2; queue<node>q; node1.x=a; node1.y=b; node1.time=0; q.push(node1); vis[node1.x][node1.y]=1; while(!q.empty()) { node2=q.front(); // printf("%d %d %d--->\n",node2.x,node2.y,node2.time); q.pop(); if(map[node2.x][node2.y]=='T') { printf("%d\n",node2.time); return; } for(int i=0;i<4;i++) { node1.x=node2.x+dx[i]; node1.y=node2.y+dy[i]; if((map[node1.x][node1.y]=='.'||map[node1.x][node1.y]=='T')&&!vis[node1.x][node1.y]) { node1.time=node2.time+1; q.push(node1); vis[node1.x][node1.y]=1; } if(map[node1.x][node1.y]=='*') continue; if(map[node1.x][node1.y]=='-') { if(node2.time%2==0) //也就是说楼梯当前的状态任然是'-' { if(node1.x==node2.x) //横坐标相同,说明此时可以从楼梯过 { node1.y=node1.y*2-node2.y; //从楼梯过去之后纵坐标要发生变化 if(node1.y>=1&&node1.y<=n&&(map[node1.x][node1.y]=='.'||map[node1.x][node1.y]=='T')&&!vis[node1.x][node1.y]) node1.time=node2.time+1; q.push(node1); vis[node1.x][node1.y]=1; } else //说明此时不可以从楼梯过,要等待1分钟 { node1.time=node2.time+1; node1.x=node2.x; node1.y=node2.y; q.push(node1); vis[node1.x][node1.y]=1; } } else //说明此时的状态时'|' { if(node1.y==node2.y) //纵坐标相同,说明此时可以从楼梯过 { node1.x=node1.x*2-node2.x; if(node1.x>=1&&node1.x<=m&&(map[node1.x][node1.y]=='.'||map[node1.x][node1.y]=='T')&&!vis[node1.x][node1.y]) { node1.time=node2.time+1; q.push(node1); vis[node1.x][node1.y]=1; } } else { node1.x=node2.x; node1.y=node2.y; node1.time=node2.time+1; q.push(node1); vis[node1.x][node1.y]=1; } } } if(map[node1.x][node1.y]=='|') { if(node2.time%2==0) //说明此时的状态任然是'|' { if(node1.y==node2.y) //如果纵坐标相同说明此时可以从楼梯过 { node1.x=node1.x*2-node2.x; if(node1.x>=1&&node1.x<=m&&(map[node1.x][node1.y]=='.'||map[node1.x][node1.y]=='T')&&!vis[node1.x][node1.y]) { node1.time=node2.time+1; q.push(node1); vis[node1.x][node1.y]=1; } } else { node1.x=node2.x; node1.y=node2.y; node1.time=node2.time+1; q.push(node1); vis[node1.x][node1.y]=1; } } else //说明此时的状态是'-' { if(node1.x==node2.x) //横坐标相同,说明此时可以从楼梯过 { node1.y=node1.y*2-node2.y; if(node1.y>=1&&node1.y<=n&&(map[node1.x][node1.y]=='.'||map[node1.x][node1.y]=='T')&&!vis[node1.x][node1.y]) { node1.time=node2.time+1; q.push(node1); vis[node1.x][node1.y]=1; } } else //横坐标不相同,说明此时需要等待1分钟 { node1.x=node2.x; node1.y=node2.y; node1.time=node2.time+1; q.push(node1); vis[node1.x][node1.y]=1; } } } } } } int main() { while(scanf("%d%d",&m,&n)!=EOF) { for(int i=1;i<=m;i++) { getchar(); for(int j=1;j<=n;j++) { scanf("%c",&map[i][j]); if(map[i][j]=='S') { a=i; b=j; } } } bfs(); } return 0; }