TYVJ P3522 &&洛谷 P1135 奇怪的电梯 Label:bfs

Posted Radiumlrb

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TYVJ P3522 &&洛谷 P1135 奇怪的电梯 Label:bfs相关的知识,希望对你有一定的参考价值。

题目描述

呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第i层楼(1<=i<=N)上有一个数字Ki(0<=Ki<=N)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:3 3 1 2 5代表了Ki(K1=3,K2=3,……),从一楼开始。在一楼,按“上”可以到4楼,按“下”是不起作用的,因为没有-2楼。那么,从A楼到B楼至少要按几次按钮呢?

输入输出格式

输入格式:

 

输入文件共有二行,第一行为三个用空格隔开的正整数,表示N,A,B(1≤N≤200, 1≤A,B≤N),第二行为N个用空格隔开的正整数,表示Ki。

 

输出格式:

 

输出文件仅一行,即最少按键次数,若无法到达,则输出-1。

 

输入输出样例

输入样例#1:
LIFT.IN
5 1 5
3 3 1 2 5
输出样例#1:
LIFT.OUT
3

 代码

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<queue>
 6 #include<vector>
 7 using namespace std;
 8 struct cc{
 9     int num,step;
10 };
11 
12 cc make_cc(int num,int step){
13     cc a;
14     a.num=num;a.step=step;
15     return a;
16 }
17 
18 int a[100005],vis[100005],N,A,B,cnt;
19 queue<cc> que;
20 int main(){
21 //    freopen("01.in","r",stdin);
22 //    freopen("01.out","w",stdout);
23 
24     scanf("%d%d%d",&N,&A,&B);
25     for(int i=1;i<=N;i++){
26         scanf("%d",&a[i]);
27     }
28 
29     que.push(make_cc(A,0));
30     vis[A]=1;
31     while(!que.empty()){
32         cc tmp=que.front();que.pop();
33         
34         if(tmp.num==B){
35             printf("%d\\n",tmp.step);
36             return 0;
37         }
38         
39         int low=tmp.num-a[tmp.num],high=tmp.num+a[tmp.num];
40         
41         if(low>=1 && !vis[low]){
42             que.push(make_cc(low,tmp.step+1));vis[low]=1;
43         }
44         if(high<=N && !vis[high]){
45             que.push(make_cc(high,tmp.step+1));vis[high]=1;
46         }
47     }
48     
49     puts("-1");
50     
51 //    fclose(stdin);
52 //    fclose(stdout);
53     return 0;
54 }
正解

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<queue>
 6 #include<vector>
 7 using namespace std;
 8 int a[100005],vis[100005],N,A,B,cnt;
 9 queue<int> que;
10 int main(){
11 //    freopen("01.in","r",stdin);
12 //    freopen("01.out","w",stdout);
13 
14     scanf("%d%d%d",&N,&A,&B);
15     for(int i=1;i<=N;i++){
16         scanf("%d",&a[i]);
17     }
18 
19     que.push(A);
20     vis[A]=1;
21     while(!que.empty()){
22         int tmp=que.front();que.pop();
23         int low=tmp-a[tmp],high=tmp+a[tmp];
24         
25         if(tmp==B){
26             printf("%d\\n",cnt);
27             return 0;
28         }
29         
30         if(low>0&&!vis[low]){
31             que.push(low);vis[low]=1;
32         }
33         if(high<=N&&!vis[high]){
34             que.push(high);vis[high]=1;
35         }
36         cnt++;
37     }
38     
39     puts("-1");
40     
41 //    fclose(stdin);
42 //    fclose(stdout);
43     return 0;
44 }
错误代码

错误代码是没有考虑到cnt可能不符合当前的步数

因为没理解好bfs导致错误,cnt一直增加,而步数是随bfs深度增加的

以上是关于TYVJ P3522 &&洛谷 P1135 奇怪的电梯 Label:bfs的主要内容,如果未能解决你的问题,请参考以下文章

洛谷P1372 又是毕业季I&&P1414 又是毕业季II[最大公约数]

BZOJ1229 & 洛谷2917:[USACO2008 NOV]toy 玩具 & 洛谷4480:[BJWC2018]餐巾计划问题——题解

洛谷——P4018 Roy&October之取石子

洛谷 P1029 最大公约数和最小公倍数问题 Label:Water&&非学习区警告

洛谷P2158- SDOI2008]仪仗队 - 莫比乌斯反演 & 欧拉函数

BZOJ2830 & 洛谷3830:[SHOI2012]随机树——题解