您的位置:首页 > 其它

HDU1180诡异的楼梯(bfs+优先队列+特殊判断)

2018-02-06 19:12 417 查看
题解:本题难点就是遇到楼梯的判断,我用一个优先队列保存到当前的步数,如果下一步是楼梯,如果截至目前步数为奇数,则楼梯方向要变,并且如果楼梯的方向变成与当前要走的方向不一致,则要等一分钟;否则直接到楼梯的另一头。可能读我代码的会觉得我的代码会存在这样的问题,就是到了楼梯的另一端可能还会返回,但我有用book数组标记了,即这种情况会被筛掉。以下代码在HDOJ测0ms

AC代码如下:#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;

struct node
{
int step,x,y;
friend bool operator < (node a,node b)
{
return a.step > b.step;
}
};

char map[21][21];
int book[21][21],n,m,nex[4][2]={0,1,1,0,0,-1,-1,0};
priority_queue<node> que;

bool pan(int x,int y)
{
if(x<0||x>=n||y<0||y>=m)
return true;
return false;
}

int bfs(int x,int y)
{
node now,xia;
int i;
while(!que.empty())
que.pop();
now.x=x;
now.y=y;
now.step=0;
book[x][y]=1;
que.push(now);
while(!que.empty())
{
now=que.top();
que.pop();
for(i=0;i<4;i++)
{
xia.x=now.x+nex[i][0];
xia.y=now.y+nex[i][1];
xia.step=now.step+1;
if(pan(xia.x,xia.y) || book[xia.x][xia.y] || map[xia.x][xia.y]=='*')
continue;
if(map[xia.x][xia.y]=='|') //偶数不变,奇数改变
{
if(xia.y!=now.y)
{
xia.y=xia.y+xia.y-now.y;
if(now.step%2==0)
xia.step++;
}
else
{
xia.x=xia.x+xia.x-now.x;
if(now.step%2==1)
{
xia.step++;
}
}
if(pan(xia.x,xia.y) || book[xia.x][xia.y] || map[xia.x][xia.y]=='*')
{
continue;
}
}
else if(map[xia.x][xia.y]=='-')
{
if(xia.y!=now.y)
{
xia.y=xia.y+xia.y-now.y;
if(now.step%2==1)
xia.step++;
}
else
{
xia.x=xia.x+xia.x-now.x;
if(now.step%2==0)
xia.step++;
}
if(pan(xia.x,xia.y) || book[xia.x][xia.y] || map[xia.x][xia.y]=='*')
continue;
}
if(map[xia.x][xia.y]=='T')
return xia.step;
book[xia.x][xia.y]=1;
que.push(xia);
}
}
return 0;
}

int main()
{
int i,j,a=9,b=8,flag;
while(cin>>n>>m)
{
getchar();
for(i=flag=0;i<n;i++)
{
cin>>map[i];
for(j=0;!flag&&j<m;j++)
if(map[i][j]=='S')
{
a=i;
b=j;
flag=1;
}
}
memset(book,0,sizeof(book));
cout<<bfs(a,b)<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: