题目大意:
给出楼层总数,给出起始位置和终点位置。 然后现在 你在一个升降机里面,只能按 上升或者下降,给出 处在每层的时候 升降机运动的层数。也就是说,看样例:
现在处在 1 楼 ,要去 5楼。在 1 楼不可以按 下降,因为不可以降落到 -2 层。如果上升的话,会上升到 4 。也就是说上升或者下降越界的话,就不可以执行。
问 从起点到终点需要的最短次数。如果怎样都到不了没输出 -1
思路:
从 起点 bfs 就好了,还比较简单,只是上下两个状态。
感想:
这几个题豆豆教了我一晚上,想他请教了好多,,自己代码就是不过。,不知道为什么。。。。
AC代码:
#include<iostream>
#include<string.h>
#include<queue>
#include<stdio.h>
using namespace std;
int mapp[205];
int vis[205];
int n,st,endd;
struct lift
{
int x;
int num;
friend bool operator < (lift a,lift b)
{
return a.num>b.num;
}
};
int bfs()
{
priority_queue<lift>que;
lift star;
star.x=st;
star.num=0;
que.push(star);
lift now,now1;
while(!que.empty())
{
now=que.top();
que.pop();
vis[now.x]=1;
if(now.x==endd)
{
int t=now.num;
return t;
}
now1=now;
now.x=now.x+mapp[now.x];
now.num++;
if(now.x>0&&now.x<=n&&!vis[now.x])
que.push(now);
now1.num++;
now1.x=now1.x-mapp[now1.x];
if(now1.x>0&&now1.x<=n&&!vis[now1.x])
que.push(now1);
}
return 0;
}
int main()
{
int i,j;
while(~scanf("%d",&n))
{
if(n==0) break;
cin>>st>>endd;
for(i=1;i<=n;i++)
scanf("%d",&mapp[i]);
memset(vis,0,sizeof(vis));
int work=0;
if(st==endd)
{
cout<<0<<endl;
continue;
}
work=bfs();
if(work)
cout<<work<<endl;
else
cout<<-1<<endl;
}
return 0;
}