P1135 奇怪的电梯
题目描述
呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第i层楼上有一个数字。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:代表了,从1楼开始。在楼,按“上”可以到4楼,按“下”是不起作用的,因为没有楼。那么,从楼到楼至少要按几次按钮呢?
输入格式
共二行。
第一行为个用空格隔开的正整数,表示。
第二行为N个用空格隔开的非负整数,表示。
输出格式
一行,即最少按键次数,若无法到达,则输出。
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
typedef struct
{
int floor;
int step;
} qqq;
queue<qqq> q;
int n, a, b;
int s[1000]; //数组s记录每个楼层按按钮后能上下的楼层数
int t[1000] = {0}; //数组t记录各个楼层是否已经到达过(已访问过)
int main()
{
qqq e1, e2;
cin >> n >> a >> b;
for (int i = 1; i <= n; i++)
{
cin >> s[i];
}
e1.floor = a;
e1.step = 0;
q.push(e1);
t[a] = 1;
while (!q.empty())
{
e2 = q.front(); //获取队头元素
q.pop(); //队头元素出队
if (e2.floor == b)
{
break; //检查当前状态的楼层编号是否为b,是则说明已经找到最终解,跳出循环
}
int temp = e2.floor + s[e2.floor]; //按向上按钮后能够到达的楼层
if (temp <= n && t[temp] == 0) //如果按向上按钮能到达的楼层有效并且未访问过该楼层
{
e1.floor = temp;
e1.step = e2.step + 1;
q.push(e1);
t[temp] = 1; //设该楼层为已访问过
}
temp = e2.floor - s[e2.floor]; //按向下按钮后能够到达的楼层
if (temp >= 1 && t[temp] == 0) //如果按向下按钮能到达的楼层有效并且未访问过该楼层
{
e1.floor = temp;
e1.step = e2.step + 1;
q.push(e1);
t[temp] = 1; //设该楼层为已访问过
}
}
//如果当前楼层为b,输出按按钮次数,否则无解(输出-1)
if (e2.floor == b)
{
cout << e2.step << endl;
}
else
cout << -1 << endl;
return 0;
}

浙公网安备 33010602011771号