G

085王子 - 周赛8.C - P1135 奇怪的电梯

public
Guest Apr 26, 2025 Never 44
Clone
C++ 085王子 - 周赛8.C - P1135 奇怪的电梯 67 lines (66 loc) | 1.54 KB
1
/*
2
hack 数据
3
3 2 3
4
2 1 1
5
正确 1
6
输出 2
7
dfs,每个点只访问一次,是不对的
8
这道题,用队列 bfs 写。
9
*/
10
11
#include<bits/stdc++.h>
12
using namespace std;
13
int n,st,ed;
14
struct sb{
15
int l,r;
16
};
17
int vis[202];
18
sb all[202];
19
int dis[202]; //
20
int sec(int s){
21
queue<int> q;
22
vis[s] = true; // s 访问过
23
dis[s] = 0; // s 点的到 起点的距离 为 0
24
q.push(s); // 队列,先进先出
25
while(q.size()) { // 队列元素个数 不等于 0,即队列非空
26
int u = q.front(); q.pop();
27
if(u == ed) return dis[u]; // 到达终点,返回到 起点的距离
28
if( all[u].l >= 1 && vis[all[u].l] == false) { // 左边移动的位置 不越界 且 未访问过
29
vis[all[u].l] = true; // 标记 访问过
30
dis[all[u].l] = dis[u] + 1; // 距离 +1
31
q.push(all[u].l); // 放入队列
32
}
33
if( all[u].r <= n && vis[all[u].r] == false) { // 右边移动的位置 不越界 且 未访问过
34
vis[all[u].r] = true;
35
dis[all[u].r] = dis[u] + 1;
36
q.push(all[u].r);
37
}
38
}
39
return 0x7FFFFFFF;
40
// if(vis[s]!=0)return vis[s];
41
// if(ed==s){
42
// return 0;
43
// }
44
// vis[s]=0x7FFFFFFF;
45
// int a;
46
// if(all[s].l>0){
47
// a=sec(all[s].l);
48
// }
49
//
50
// if(all[s].r<=n){
51
// a=min(a,sec(all[s].r));
52
// }
53
// if(a!=0x7FFFFFFF)++a;
54
// vis[s]=min(vis[s],a);
55
// return vis[s];
56
}
57
int main(){
58
cin>>n>>st>>ed;
59
for(int i=1;i<=n;++i){
60
int tmp;cin>>tmp;
61
all[i].l=i-tmp;all[i].r=i+tmp;
62
}
63
int s=sec(st);
64
if(s==0x7FFFFFFF)cout<<"-1"<<endl;
65
else cout<<s<<endl;
66
return 0;
67
}