hdu 1180 诡异的楼梯
楼梯诡异是因为楼梯每一分钟它都会变换方向 竖直方向与水平方向轮流交换
找优先队列的题找到这题的 所以就会往优先队列的方向去向 显然就是以走过的步数作为排序的条件
这题中跨越梯子的那步是不算的 而且可以在原地等一步梯子转到自己要走的方向 所以在遇到梯子的时候就需要进行判断 然后跨越梯子之后判断有木有到达终点
这题中n m值与常规遇到的不一样。。。。
代码如下:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <string>
#include <queue>
#define eps 1e-8
#define op operator
#define MOD 10009
#define MAXN 100100
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define FOV(i,a,b) for(int i=a;i>=b;i--)
#define REP(i,a,b) for(int i=a;i<b;i++)
#define REV(i,a,b) for(int i=a-1;i>=b;i--)
#define MEM(a,x) memset(a,x,sizeof a)
#define ll __int64
using namespace std;
struct node
{
int x,y;
int step;
bool operator <(const node p)const
{
return step>p.step;
}
};
int m,n;
node p,q;
char map[25][25];
int vis [25][25];
int sx,sy,tx,ty;
int dir[4][2]={{0,-1},{0,1},{1,0},{-1,0}};
int check(int x,int y,int t,int d)
{
if(t%2==0)
{
if(map[x][y]=='|')
{
if(d==0||d==1)
t++;
}
else
{
if(d==2||d==3)
t++;
}
}
else
{
if(map[x][y]=='-')
{
if(d==0||d==1)
t++;
}
else
{
if(d==2||d==3)
t++;
}
}
return t+1;
}
void bfs()
{
priority_queue<node> Q;
p.x=sx; p.y=sy; p.step=0;
Q.push(p);
while(!Q.empty())
{
p=Q.top(); Q.pop();
if(p.x==tx&&p.y==ty)
{
printf("%d\n",p.step);
return;
}
for(int i=0;i<4;i++)
{
q.x=p.x+dir[i][0];
q.y=p.y+dir[i][1];
q.step=p.step;
if(q.x>=0&&q.x<m&&q.y>=0&&q.y<n&&!vis[q.x][q.y]&&map[q.x][q.y]!='*')
{
if(map[q.x][q.y]=='.'||map[q.x][q.y]=='T')
{
q.step++;
vis[q.x][q.y]=1;
if(q.x==tx&&q.y==ty)
{
printf("%d\n",q.step);
return;
}
Q.push(q);
}
if(map[q.x][q.y]=='|'||map[q.x][q.y]=='-')
{
int num,xx,yy;
num=check(q.x,q.y,q.step,i);
// q.step=num;
xx=q.x+dir[i][0]; yy=q.y+dir[i][1];
if(xx>=0&&xx<m&&yy>=0&&yy<n&&!vis[xx][yy]&&map[xx][yy]!='*')
{
q.x=xx; q.y=yy;
q.step=num;
vis[q.x][q.y]=1;
// Q.push(q);
if(q.x==tx&&q.y==ty)
{
printf("%d\n",q.step);
return;
}
Q.push(q);
}
}
}
}
}
}
int main()
{
//freopen("ceshi.txt","r",stdin);
while(scanf("%d%d",&m,&n)!=EOF)
{
for(int i=0;i<m;i++)
{
scanf("%s",map[i]);
for(int j=0;j<n;j++)
{
if(map[i][j]=='S')
{
sx=i; sy=j;
}
if(map[i][j]=='T')
{
tx=i; ty=j;
}
}
}
MEM(vis,0);
bfs();
}
return 0;
}