hdu 1548 A strange lift
2017-09-21 23:11
337 查看
[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]
[align=left]3[/align]
[align=left]这道题初始想法是用BFS,后来发现原来dijkstra也可以做。[/align]
[align=left]具体做法就是将每一层电梯看作一个结点,如果层x有通向层y的路,则将x,y边的权值记为1,无路则为INF(构边时为单向边)然后dijkstra求从结点A到结点B的最短路径就[/align]
[align=left]ok了。[/align]
[align=left]
[/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]
[align=left]3[/align]
[align=left]这道题初始想法是用BFS,后来发现原来dijkstra也可以做。[/align]
[align=left]具体做法就是将每一层电梯看作一个结点,如果层x有通向层y的路,则将x,y边的权值记为1,无路则为INF(构边时为单向边)然后dijkstra求从结点A到结点B的最短路径就[/align]
[align=left]ok了。[/align]
#include<iostream> #include<cstring> using namespace std; #define INF 0x3f3f3f3f int n,a,b; int p[201]; int map[201][201]; int d[201]; int vis[201]; void dij(){ memset(map,0x3f,sizeof(map)); int i,j,v,min; for(i=1;i<=n;i++){ map[i][i]=0; vis[i]=0; if(i+p[i]<=n) map[i][i+p[i]]=1; if(i-p[i]>=1) map[i][i-p[i]]=1; } for(i=1;i<=n;i++){ d[i]=map[a][i]; } for(i=1;i<=n;i++){ min=INF; for(j=1;j<=n;j++){ if(vis[j]==0&&d[j]<min){ v=j; min=d[j]; } }vis[v]=1; for(j=1;j<=n;j++){ if(vis[j]==0&&d[j]>d[v]+map[v][j]) d[j]=d[v]+map[v][j]; } }if(d[b]<INF) cout<<d[b]<<endl; else cout<<-1<<endl; } int main(){ int i,j; while(cin>>n&&n!=0){ cin>>a>>b; for(i=1;i<=n;i++){ cin>>p[i]; } dij(); } }
[align=left]
[/align]
相关文章推荐
- HDU-1548--A strange lift--(BFS,剪枝)
- HDU 1548 A strange lift(BFS)
- HDU 1548 A strange lift(简单BFS)
- HDU 1548 A strange lift
- HDU 1548 A strange lift(BFS)
- 【Dijkstra】-HDU-1548-A strange lift
- HDU 1548 A strange lift (Dijkstra算法)
- 广度优先搜索:A strange lift HDU - 1548
- hdu 1548 A strange lift(优先队列)
- hdu 1548 A strange lift
- 【SPFA】hdu 1548 A strange lift
- HDU 1548 A strange lift
- hdu1548 A strange lift(bfs)
- HDU 1548 A strange lift (BFS或最短路)
- hdu 1548 A strange lift
- hdu 1548 A strange lift <java>
- HDU 1548 A strange lift bfs 宽搜解析
- 【BFS/Dijkstra】hdu 1548 A Strange Lift
- hdu 1548 A strange lift(最短路)
- HDU 1548 A strange lift