奇怪的电梯(BFS)

问题 AF: 奇怪的电梯

时间限制: 1.000 Sec 内存限制: 64 MB

题目描述

有一天桐桐做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第i层楼(1≤i≤N)上有一个数字K;(0≤Ki≤N)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:3 3 1 2 5代表了Ki (K1=3,K2=3,…),从一楼开始。在一楼,按“上,”可以到4楼,按“下”是不起作用的,因为没有-2楼。那么,从A楼到B楼至少要按几次按钮呢?

输入

第1行为三个正整数,表示N,A,B(1≤N≤200,1≤A,B≤N);
第2行为N个正整数,表示Ki。

输出

1行,即最少按键次数,若无法到达,则输出-1。

样例输入 Copy

3 3 1 2 5```

### 样例输出 Copy
```3```

### 提示
上述答案得到方式如下:
从1楼按上,上到4楼
在4楼按下,到达2楼
在2楼按上,到达5楼
共3步


---
好多地方忘了:(


```cpp#include <iostream>
#include <queue>
#include <cstring>

using namespace std;

short ki[205], vis[205];//bfs需要标记访问,剪枝,否则会爆内存

int main() {
    short n, a, b;
    cin >> n >> a >> b;

    memset(vis, 0, sizeof(vis)); // 正确初始化 vis

    for (int i = 1; i <= n; i++) cin >> ki[i]; // 1-based 读取数据

    queue<short> q;
    q.push(a);
    vis[a] = 1; // 标记起点已访问
    int ans = 0;

    while (!q.empty()) {
        int sz = q.size(); // 记录当前层的节点数
        while (sz--) {
            short loc = q.front();
            q.pop();

            if (loc == b) {//输出条件
                cout << ans;
                return 0;
            }

            // 向上跳
            if (loc + ki[loc] <= n && vis[loc + ki[loc]] == 0) {
                q.push(loc + ki[loc]);
                vis[loc + ki[loc]] = 1; // 访问标记,,放入队列就需要标注,不然会再次放入
            }

            // 向下跳
            if (loc - ki[loc] >= 1 && vis[loc - ki[loc]] == 0) {
                q.push(loc - ki[loc]);
                vis[loc - ki[loc]] = 1; // 访问标记
            }
        }
        ans++; // 只有当前层遍历完才加 1
    }

    cout << -1; // 无法到达
    return 0;
}
posted @   bakul  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示