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;
}

 

posted @ 2022-01-14 16:01  亚托莉的亚托莉  阅读(94)  评论(0)    收藏  举报