诡异的楼梯
原题链接https://vjudge.net/contest/345248#problem/M
由题意可知,题目大概还是一个迷宫问题,大概思路不变,但是需要增加情况,对于到楼梯前的时候我们需要进行特判,对于左右移动和上下移动以及楼梯最开始的情况进行特判,我们可以通过记录步数的奇偶来判断到达楼梯前时楼梯的状态。
#include<cstring>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
using namespace std;
long long m,n;
char map[30][30];//地图
long long vis[30][30];//标记
long long mv[4][2]= {1,0,-1,0,0,1,0,-1};//方向
struct node
{
long long x;
long long y;
long long step;
} t1,t2;
void bfs()
{
long long i,j;
queue<node>q;
node s,e;
vis[t1.x][t1.y]=1;
q.push(t1);
while(!q.empty())
{
s=q.front();
q.pop();
if(s.x==t2.x&&s.y==t2.y)//结束
{
printf("%lld\n",s.step);
return ;
}
for(i=0; i<4; i++)//四个方向
{
e.x=s.x+mv[i][0];
e.y=s.y+mv[i][1];
if(e.x<0||e.y<0||e.x>n-1||e.y>m-1||map[e.x][e.y]=='*'||vis[e.x][e.y]==1)
{
continue;
}
// printf("*************************************\n");
// printf("%lld %lld\n",e.x,e.y);
// printf("%lld***\n",i);
// printf("%c %lld\n",map[e.x][e.y],e.step);
if(map[e.x][e.y]=='.'||map[e.x][e.y]=='T')//正常路
{
// printf("*\n");
vis[e.x][e.y]=1;
e.step=s.step+1;
q.push(e);
continue;
}
else if(i==2||i==3)//左右走时
{
if(map[e.x][e.y]=='-'&&s.step%2==0)//可以走楼梯 跳向下一格
{
// printf("**\n");
e.x=e.x+mv[i][0];
e.y=e.y+mv[i][1];
if(e.x<0||e.y<0||e.x>n-1||e.y>m-1||vis[e.x][e.y]==1||map[e.x][e.y]=='*')
{
continue;
}
vis[e.x][e.y]=1;
e.step=s.step+1;
q.push(e);
}
else if(map[e.x][e.y]=='|'&&s.step%2!=0)//可以走楼梯
{
// printf("***\n");
e.x=e.x+mv[i][0];
e.y=e.y+mv[i][1];
if(e.x<0||e.y<0||e.x>n-1||e.y>m-1||vis[e.x][e.y]==1||map[e.x][e.y]=='*')
{
continue;
}
vis[e.x][e.y]=1;
e.step=s.step+1;
q.push(e);
}
else//不能走原地停一次
{
// printf("****\n");
e.x=s.x;
e.y=s.y;
e.step=s.step+1;
vis[e.x][e.y]=1;
q.push(e);
}
}
else if(i==0||i==1)//上下走
{
if(map[e.x][e.y]=='-'&&s.step%2!=0)//走楼梯
{
// printf("*****\n");
e.x=e.x+mv[i][0];
e.y=e.y+mv[i][1];
if(e.x<0||e.y<0||e.x>n-1||e.y>m-1||vis[e.x][e.y]==1||map[e.x][e.y]=='*')
{
continue;
}
vis[e.x][e.y]=1;
e.step=s.step+1;
q.push(e);
}
else if(map[e.x][e.y]=='|'&&s.step%2==0)//走楼梯
{
// printf("******\n");
e.x=e.x+mv[i][0];
e.y=e.y+mv[i][1];
if(e.x<0||e.y<0||e.x>n-1||e.y>m-1||vis[e.x][e.y]==1||map[e.x][e.y]=='*')
{
continue;
}
vis[e.x][e.y]=1;
e.step=s.step+1;
q.push(e);
}
else//原地停一次
{
// printf("***************\n");
e.x=s.x;
e.y=s.y;
e.step=s.step+1;
vis[e.x][e.y]=1;
q.push(e);
}
}
}
}
}
int main()
{
while(~scanf("%lld %lld",&n,&m))
{
memset(vis,0,sizeof(vis));
memset(map,0,sizeof(map));
long long i,j;
for(i=0; i<n; i++)
{
getchar();
for(j=0; j<m; j++)
{
scanf("%c",&map[i][j]);
if(map[i][j]=='T')//终点
{
t2.x=i;
t2.y=j;
t2.step=0;
}
if(map[i][j]=='S')//起点
{
t1.x=i;
t1.y=j;
t1.step=0;
}
}
}
/*for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
printf("%c",map[i][j]);
}
printf("\n");
}*/
bfs();
}
return 0;
}