您的位置:首页 > 其它

hdu 1548 A strange lift(最短路)

2016-06-20 20:08 330 查看
题目大意:

思路:

/*
hdu 1548 A strange lift
题目大意:这是一个奇怪的楼梯。你可以停在任何你想停的一层……
如果你在第i层,这一层有个值Ki,按了“UP”,你就上升Ki层,
即到了i+Ki层,“DOWN”就是减,同“UP”
A到B至少需要多少次操作,无法到达就输出-1
思路:bfs求最短路,使用队列
*/
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;

int k[205];//
int vis[205];//标记是否走过
int bfs[205];
int main()
{
int n,a,b;
while(~scanf("%d%d%d",&n,&a,&b)&&n)
{
int flag=0;
for(int i=1;i<=n;i++)
scanf("%d",&k[i]);
memset(vis,0,sizeof(vis));//清
memset(bfs,0,sizeof(bfs));
queue<int>p;
p.push(a);
vis[a]=1;//标记已经走过,如果回到已经走过的地方,相当于还是没走哈
//所以就肯定不是最短路径了
while(!p.empty())//非空的时候
{
int pr=p.front();
p.pop();
if(pr==b)//已经到目的地的话
{
flag=1;
break;
}
int x =pr+k[pr];
if(x>=1&&x<=n&&vis[x]==0)//并且还未走过
{
vis[x]=1;//标记走过
p.push(x);
bfs[x]=bfs[pr]+1;
}
x =pr-k[pr];
if(x>=1&&x<=n&&vis[x]==0)
{
vis[x]=1;
p.push(x);
bfs[x]=bfs[pr]+1;
}
}
if(flag)
printf("%d\n",bfs[b]);
else
printf("-1\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: