HDU1548 A strange lift BFS 简单题

一个电梯有n层,每一层有一个数k[i],和2个按钮,UP和DOWN,表示从这一层可以到达i+k[i] 或i-k[i] .

给出a,b,问从a到b 最少需要按多少下按钮。

直接bfs.

 

 1 #include<cstdio>
 2 #include<queue>
 3 #include<cstring>
 4 using namespace std;
 5 const int maxn=210;
 6 int n,a,b;
 7 int k[maxn];
 8 bool vis[maxn];
 9 int time[maxn];
10 int bfs()
11 {
12     memset(vis,false,sizeof(vis));
13     queue<int>que;
14     while(!que.empty())
15         que.pop();
16     que.push(a);
17     vis[a]=true;
18     time[a]=0;
19     while(!que.empty())
20     {
21         int u=que.front();
22         que.pop();
23         if(u==b)
24             return time[b];
25         if(u-k[u]>0&&!vis[u-k[u]])
26         {
27             que.push(u-k[u]);
28             vis[u-k[u]]=true;
29             time[u-k[u]]=time[u]+1;
30         }
31         if(u+k[u]<=n&&!vis[u+k[u]])
32         {
33             que.push(u+k[u]);
34             vis[u+k[u]]=true;
35             time[u+k[u]]=time[u]+1;
36         }
37     }
38     return -1;
39 }
40 int main()
41 {
42     while(scanf("%d%d%d",&n,&a,&b))
43     {
44         if(!n)
45             break;
46         for(int i=1;i<=n;i++)
47             scanf("%d",&k[i]);
48         int ans=bfs();
49         printf("%d\n",ans);
50     }
51     return 0;
52 }
提交代码

 

 

posted on 2015-04-05 15:25  _fukua  阅读(183)  评论(0编辑  收藏  举报