HDU 1548 A strange lift(最短路&&bfs)
2017-08-02 17:30
423 查看
A strange lift
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 26943 Accepted Submission(s): 9699
[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
最短路是有向图,不是无向图,一个电梯向上不过n,向下不过1。
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <vector> #include <queue> #include <cstdlib> #include <iomanip> #include <cmath> #include <ctime> #include <map> #include <set> using namespace std; #define lowbit(x) (x&(-x)) #define max(x,y) (x>y?x:y) #define min(x,y) (x<y?x:y) #define MAX 100000000000000000 #define MOD 1000000007 #define pi acos(-1.0) #define ei exp(1) #define PI 3.141592653589793238462 #define ios() ios::sync_with_stdio(false) #define INF 0x3f3f3f3f #define mem(a) (memset(a,0,sizeof(a))) typedef long long ll; int dis[250],g[250][250],vis[250]; int a[250],n,x,y,k; void init() { for(int i=1;i<=n;i++) { for(int j=1;j<i;j++) { g[i][j]=g[j][i]=INF; } g[i][i]=0; } } void dij(int x) { for(int i=1;i<=n;i++) { dis[i]=g[x][i]; vis[i]=0; } vis[x]=1; int minn,v=x; for(int i=1;i<n;i++) { minn=INF; for(int j=1;j<=n;j++) { if(!vis[j] && minn>dis[j]) { minn=dis[j]; v=j; } } if(minn==INF) break; vis[v]=1; for(int j=1;j<=n;j++) { if(!vis[j]) dis[j]=min(dis[j],dis[v]+g[v][j]); } } } int main() { while(scanf("%d",&n)&&n) { init(); scanf("%d%d",&x,&y); for(int i=1;i<=n;i++) { scanf("%d",&k); if(i-k>=1) g[i][i-k]=1; if(i+k<=n) g[i][i+k]=1; } dij(x); printf("%d\n",dis[y]==INF?-1:dis[y]); } return 0; }
bfs
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <vector> #include <queue> #include <cstdlib> #include <iomanip> #include <cmath> #include <ctime> #include <map> #include <set> using namespace std; #define lowbit(x) (x&(-x)) #define max(x,y) (x>y?x:y) #define min(x,y) (x<y?x:y) #define MAX 100000000000000000 #define MOD 1000000007 #define pi acos(-1.0) #define ei exp(1) #define PI 3.141592653589793238462 #define ios() ios::sync_with_stdio(false) #define INF 0x3f3f3f3f #define mem(a) (memset(a,0,sizeof(a))) typedef long long ll; int vis[250],x,n; int dis[250],y,xx; struct node { int x; int step; }ans,pos; int bfs(int A,int B) { queue<node>q; memset(vis,0,sizeof(vis)); vis[A]=1; pos.x=A;pos.step=0; q.push(pos); while(!q.empty()) { pos=q.front(); q.pop(); if(pos.x==B) return pos.step; xx=pos.x+dis[pos.x]; if(x<=n && !vis[xx]) { ans.x=xx; ans.step=pos.step+1; vis[xx]=1; q.push(ans); } xx=pos.x-dis[pos.x]; if(x>=1 && !vis[xx]) { ans.x=xx; ans.step=pos.step+1; vis[xx]=1; q.push(ans); } } return -1; } int main() { while(scanf("%d",&n)&&n) { scanf("%d%d",&x,&y); for(int i=1;i<=n;i++) { scanf("%d",&dis[i]); } printf("%d\n",bfs(x,y)); } return 0; }
相关文章推荐
- HDU 1548 A strange lift(最短路、BFS)
- HDU 1548 A strange lift(最短路或BFS)
- HDU 1548---A strange lift(搜索&&最短路)
- HDU 1548 A strange lift (BFS或最短路)
- HDU-1548 A strange lift(最短路[Spfa || BFS])
- HDU-1548 A strange lift(单源最短路 或 BFS)
- HDU 1548 A strange lift (简单最短路或BFS)
- hdu 1548 A strange lift (bfs、最短路)
- hdu1548 A strange lift(bfs)
- HDU 1548 A strange lift(最短路)
- hdu 1548 A strange lift(水题,bfs)
- Problem M:A strange lift(HDU 1548)(bfs实现)
- hdu 1548 A strange lift <java>
- HDU-1548--A strange lift--(BFS,剪枝)
- 【BFS/Dijkstra】hdu 1548 A Strange Lift
- hdu 1548 A strange lift (BFS)
- hdu 1548 A strange lift bfs搜索 解题报告
- hdu 1548 A strange lift (BFS、Dijkstra)
- hdu 1548 A strange lift (bfs)
- A strange lift HDU 1548 queue BFS 简单 水题