zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    矩形交,线段交
    P1338 末日的传说(贪心)
    P1338 末日的传说(贪心)
    P2014 选课 (依赖性背包,树上背包) U53204 【数据加强版】选课(后序遍历优化)
    P2014 选课 (依赖性背包,树上背包) U53204 【数据加强版】选课(后序遍历优化)
    P1417 烹调方案(01背包 )
    P1417 烹调方案(01背包 )
    D. Pawn(记忆化搜索)
    蓝桥杯--数位递增的数
    汉诺塔递归算法C语言
  • 原文地址:https://www.cnblogs.com/topk/p/6580117.html
Copyright © 2011-2022 走看看