要注意的是楼梯不可以停留,并且‘|’只能从上下这两个方向移动到这个楼梯,‘-’只能从左右两个方向移动到此楼梯。并且如果下一个楼梯没法上的话,可以在原地等待一秒钟,等待楼梯变换。
并且需要注意的细节是需要判断楼梯对面的点是否可走
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <iostream>
#include <stdlib.h>
#include <math.h>
#include <string>
#include <queue>
using namespace std;
int sx,sy,bx,by,h,l,ans;
char map[22][22];
bool vis[22][22];
int dir[4][2]={1,0,-1,0,0,1,0,-1};
struct note{
int x;
int y;
int time;
};
int bfs()
{
queue<note>q;
struct note p;
vis[sx][sy]=true;
p.x=sx,p.y=sy,p.time=0;
q.push(p);
while(!q.empty())
{
struct note temp;
struct note nex;
temp=q.front();
// cout<<"时间 "<<temp.time<<" 坐标"<<temp.x<<" "<<temp.y<<endl;
q.pop();
for(int i=0;i<4;i++)
{
int xx=temp.x+dir[i][0],yy=temp.y+dir[i][1];
if(xx<1||xx>h||yy<1||yy>l||vis[xx][yy]==1||map[xx][yy]=='*') continue;
if(map[xx][yy]=='|'||map[xx][yy]=='-')//下一步为楼梯
{
if(temp.time%2==0)//初始地图
{
if(map[xx][yy]=='|'&&i<2)//下一步为|楼梯 且能直接上 当前方向状态为上或下
{
int nx=xx+dir[i][0],ny=yy+dir[i][1];//楼梯对面
if(nx<1||nx>h||ny<1||ny>l||vis[nx][ny]==1||map[nx][ny]=='*') continue;//判断楼梯对面是否可走是否
nex.x=xx+dir[i][0],nex.y=yy+dir[i][1];
nex.time=temp.time+1;
}
else if(map[xx][yy]=='|'&&i>=2)//当前状态为左或右 不能上楼梯,需要在原地等待
{
nex.x=temp.x,nex.y=temp.y;
nex.time=temp.time+1;
}
else if(map[xx][yy]=='-'&&i>=2)//下一步为-楼梯 且能直接上 当前状态为左或右
{
int nx=xx+dir[i][0],ny=yy+dir[i][1];//楼梯对面
if(nx<1||nx>h||ny<1||ny>l||vis[nx][ny]==1||map[nx][ny]=='*') continue;//判断楼梯对面是否可走
nex.x=xx+dir[i][0],nex.y=yy+dir[i][1];
nex.time=temp.time+1;
}
else if(map[xx][yy]=='-'&&i<2)//当前状态为上或下 不能上楼梯 需要在原地等待
{
nex.x=temp.x,nex.y=temp.y;
nex.time=temp.time+1;
}
}
if(temp.time%2!=0)//地图变换
{
if(map[xx][yy]=='|'&&i>=2)//此时楼梯应变为- 当前状态为左或右 可以直接上
{
int nx=xx+dir[i][0],ny=yy+dir[i][1];//楼梯对面
if(nx<1||nx>h||ny<1||ny>l||vis[nx][ny]==1||map[nx][ny]=='*') continue;//判断楼梯对面是否可走
nex.x=xx+dir[i][0],nex.y=yy+dir[i][1];
nex.time=temp.time+1;
}
else if(map[xx][yy]=='|'&&i<2)//当前状态为上或下 不能上楼梯 需要在原地等待
{
nex.x=temp.x,nex.y=temp.y;
nex.time=temp.time+1;
}
else if(map[xx][yy]=='-'&&i<2)//此时楼梯应变为| 当前状态为上或下 可以直接上
{
int nx=xx+dir[i][0],ny=yy+dir[i][1];//楼梯对面
if(nx<1||nx>h||ny<1||ny>l||vis[nx][ny]==1||map[nx][ny]=='*') continue;//判断楼梯对面是否可走
nex.x=xx+dir[i][0],nex.y=yy+dir[i][1];
nex.time=temp.time+1;
}
else if(map[xx][yy]=='-'&&i>=2)//当前状态为左或右 不能上楼梯 需要在原地等待
{
nex.x=temp.x,nex.y=temp.y;
nex.time=temp.time+1;
}
}
}
else
{
nex.x=xx,nex.y=yy;
nex.time=temp.time+1;
}
q.push(nex);
vis[nex.x][nex.y]=true;
if(map[nex.x][nex.y]=='T')
{
return nex.time;
}
}
}
return 0;
}
int main()
{
while(cin>>h>>l)
{
ans=0;
memset(map,0,sizeof(map));
memset(vis,0,sizeof(vis));
for(int i=1;i<=h;i++)
{
for(int j=1;j<=l;j++)
{
cin>>map[i][j];
if(map[i][j]=='S') sx=i,sy=j;
if(map[i][j]=='T') bx=i,by=j;
}
}
ans=bfs();
cout<<ans<<endl;
}
return 0;
}
/*
3 3
S-T
***
***
5 5
**..T
**.*.
..|..
.*.*.
S....
4 4
S.|T
...-
....
..**
5 5
S..-T
*****
*****
*****
*****
5 5
S..|T
*****
*****
*****
*****
*/