085王子 - 周赛8.C - P1135 奇怪的电梯
public
Apr 26, 2025
Never
44
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 }