HDU 1548 A strange lift
2016-07-18 20:49
295 查看
A strange lift
[align=left]Problem Description[/align]There is a strange lift.The lift can stop can at every floor as you want, and there is a number Ki(0 <= Ki <= N) on every floor.The lift have just two buttons: up and down.When you at floor i,if you press the button "UP" , you will
go up Ki floor,i.e,you will go to the i+Ki th floor,as the same, if you press the button "DOWN" , you will go down Ki floor,i.e,you will go to the i-Ki th floor. Of course, the lift can't go up high than N,and can't go down lower than 1. For example, there
is a buliding with 5 floors, and k1 = 3, k2 = 3,k3 = 1,k4 = 2, k5 = 5.Begining from the 1 st floor,you can press the button "UP", and you'll go up to the 4 th floor,and if you press the button "DOWN", the lift can't do it, because it can't go down to the -2
th floor,as you know ,the -2 th floor isn't exist.
Here comes the problem: when you are on floor A,and you want to go to floor B,how many times at least he has to press the button "UP" or "DOWN"?
[align=left]Input[/align]
The input consists of several test cases.,Each test case contains two lines.
The first line contains three integers N ,A,B( 1 <= N,A,B <= 200) which describe above,The second line consist N integers k1,k2,....kn.
A single 0 indicate the end of the input.
[align=left]Output[/align]
For each case of the input output a interger, the least times you have to press the button when you on floor A,and you want to go to floor B.If you can't reach floor B,printf "-1".
[align=left]Sample Input[/align]
5 1 5
3 3 1 2 5
0
[align=left]Sample Output[/align]
3
[align=left]题意:输入N,表示有N层楼,输入A,表示初始在A层楼,输入B,表示目的地在B层楼,然后输入N个数,表示在第i层楼可以上下a[i]层楼,求至少需要几步才能到达B层楼。[/align]
[align=left]
[/align]
[align=left]分析:感觉是一道挺简单的BFS的题目,然而TLE了好多发,后来发现一层楼只能经过一次,否则的话会出现重复的情况,因此需要标记每次到达了哪层楼。[/align]
[align=left]
[/align]
[align=left]代码:[/align]
#include<iostream> #include<cstdio> #include<cstring> #include<cstdio> #include<queue> #include<algorithm> using namespace std; int n,s,e; int a[250]; int id[250]; int ans; struct node { int x; int step; }; void bfs() { node t; t.x=s; t.step=0; id[s]=1; queue<node> q; q.push(t); while(q.empty()==0) { node t=q.front(); q.pop(); if(t.x==e) { ans=t.step; return ; } node t1,t2; t1.x=t.x+a[t.x]; if(t1.x>=1&&t1.x<=n&&id[t1.x]==0) { id[t1.x]=1; t1.step=t.step+1; q.push(t1); } t2.x=t.x-a[t.x]; if(t2.x>=1&&t2.x<=n&&id[t2.x]==0) { t2.step=t.step+1; id[t2.x]=1; q.push(t2); } } } int main() { while(~scanf("%d",&n)&&n) { scanf("%d%d",&s,&e); for(int i=1;i<=n;i++) scanf("%d",&a[i]); ans=-1; memset(id,0,sizeof(id)); bfs(); if(ans==-1) printf("-1\n"); else printf("%d\n",ans); } return 0; }题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1548
相关文章推荐
- js算法: 图的两种表示方法以及广度优先算法
- 【HDU 5366】The mook jong 详解
- 【HDU 2136】Largest prime factor 详细图解
- 【HDU 1568】Fibonacci 数学公式 详解
- HDU 1568
- HDU1290
- HDU1568(Fobonacci公式)
- HDU ACM Step 2.2.2 Joseph(约瑟夫环问题)
- HDU 1405
- HDU 1297
- hdu 1205
- hdu 2087
- hdu 1016
- HDU 4898 The Revenge of the Princess’ Knight ( 2014 Multi-University Training Contest 4 )
- HDU 5592 ZYB's Premutation 线段树(查找动态区间第K大)
- Surrounded Regions
- Word Ladder, Gray Code
- HDU 5240 Exam (好水的题)
- HDU5237 Base64 大模拟
- UVA 11624