xcoj1227-电梯

题目描述
实验楼有一部神秘的电梯,它只有“上”和“下”两个按钮,实验楼的每一层都标有一个值K,第i层的值为Ki,如果按了“上”按钮,会从第i层升到第i+Ki层;如果按了“下”按钮则会从第i层降到第i-Ki层,已知能到的层数为1到N层,GX想从第A层上到第B层,现在给你N,A,B和一串数K1到Kn,请求出GX从A到B,至少按下多少个按钮。

输入
第一行输入N,A,B( 1 <= N,A,B <= 300) ,表示实验楼共有N层,起点为A,终点为B

第二行输入N个数,表示K1到Kn

输出
对于每组数据,输出一个数,表示GX从A到B,至少按下多少个按钮,如果GX无法到达B,请输出-1.

样例输入
5 1 5
3 3 1 2 5
样例输出
3

    此题主要采用bfs进行搜索,思路挺简单的,代码中有注释.
#include <iostream>
#include <cstdio>
#include <fstream>
#include <queue>
#include <cstring>
using namespace std;

class Data
{
    public:
        int floor;   //层数
        int step;    //到此层数的步数
        bool vis;    //是否已遍历此层
        int k;       //可以跳跃的层数
};

int n, A, B;
Data data[305];

void bfs(int a, int step)
{
    queue<Data> q;
    q.push(data[a]);
    data[a].vis = true;
    while(!q.empty())
    {
        Data cnt = q.front();
        q.pop();
        if(cnt.floor == B)     //当到达目标层时,输出结果
        {
            cout << cnt.step << endl;
            return ;
        }
        if(cnt.floor - cnt.k > 0 && !data[cnt.floor - cnt.k].vis)
        {
            data[cnt.floor - cnt.k].step = cnt.step + 1;
            data[cnt.floor - cnt.k].vis = true;
            q.push(data[cnt.floor - cnt.k]);
        }
        if(cnt.floor + cnt.k <= n && !data[cnt.floor + cnt.k].vis)
        {
            data[cnt.floor + cnt.k].step = cnt.step + 1;
            data[cnt.floor + cnt.k].vis = true;
            q.push(data[cnt.floor + cnt.k]);
        }
    }
    cout << "-1" << endl;
}

int main()
{
    //ifstream cin("data1.in");
    //int n, a, b;
    while(cin >> n >> A >> B)
    {
        for(int i = 1; i <= n; i ++)
        {
            cin >> data[i].k;
            data[i].step = 0;
            data[i].vis = false;
            data[i].floor = i;
        }
        bfs(A, 0);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/topk/p/6580117.html