2511: 【普及/提高-】【P1135】奇怪的电梯
内存限制:128 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:5
解决:4
题目描述
呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第 层楼()上有一个数字 ()。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如: 代表了 (,,……),从 楼开始。在 楼,按“上”可以到 楼,按“下”是不起作用的,因为没有 楼。那么,从 楼到 楼至少要按几次按钮呢?
输入
共二行。
第一行为三个用空格隔开的正整数,表示 (,)。
第二行为 个用空格隔开的非负整数,表示 。
输出
一行,即最少按键次数,若无法到达,则输出
-1
。样例输入 复制
5 1 5
3 3 1 2 5
样例输出 复制
3
提示
对于 的数据,,,。
#include<bits/stdc++.h> using namespace std; struct node { int floor, d; //队列中记录的层数和按钮次数 }; queue<node> Q; // 广度优先搜索的队列 int n,a,b; int k[1000],vis[1000]; //每层楼上下可以跳跃几层,以及是否访问过 int main(){ cin>>n>>a>>b; for (int i=1;i<=n;i++) cin>>k[i]; Q.push((node){a, 0}); //将初始元素加入到队列 vis[a] = 1; //记录初始楼层已访问过 node now; while (!Q.empty()) { now = Q.front(); Q.pop(); if (now.floor == b) break; // 找到目标解 for (int sign = -1; sign <= 1; sign += 2) { // sign枚举-1和1 int dist = now.floor + k[now.floor] * sign; // 目标楼层,sign为1是上 if (dist >= 1 && dist <= n && vis[dist]==0) { // 如果按按钮能到达的楼层有效并且未访问过该楼层 Q.push((node){dist, now.d + 1}); vis[dist] = 1; // 该楼层为已访问过 } } } if (now.floor == b) // 找到目标解 cout << now.d << endl; else // 无法到达 cout << -1 << endl; return 0; }