P1135 奇怪的电梯

点击查看代码
#include<bits/stdc++.h> 

using namespace std;

const int MAXN = 205; // 题目说 N <= 200,稍微开大一点
int N, A, B;          // 表示N层楼,起点和终点A和B
int K[MAXN];          // K[i] 表示这层楼的数字,可以向上或向下走的层数
int dist[MAXN];       // 既表示是否去过,又表示到达这一层的最小步数


int bfs() {
    // 一个特判如果起点就是终点,步数为0
    if (A == B) return 0;
    // 1.初始化 dist 数组为 -1,表示所有楼层都没去过
    //与启动队列,把起点放入队列并标记
    memset(dist, -1, sizeof(dist));
    queue<int> q;
    
    q.push(A);
    dist[A] = 0; 

    // 2. 开始循环
    while (!q.empty()) {
        //a取出
        int u = q.front(); 
        q.pop();

        // 截止条件,已经到达终点B
        if (u == B) return dist[u];

        //b观察邻居,只有向上和向下两种选择
        int up = u + K[u];
        int down = u - K[u];

        
        //c判断与入队,在限制之中,并且没去过
        if (up <= N && dist[up] == -1) {
            dist[up] = dist[u] + 1;
            q.push(up);
        }

        if (down >= 1 && dist[down] == -1) {
            dist[down] = dist[u] + 1;
            q.push(down);
        }
    }

   //3.队列为空依旧无法到达返回-1
    return -1;
}

int main() {
    
    cin >> N >> A >> B;
    for (int i = 1; i <= N; i++) {
        cin >> K[i]; // 读入每一层能跳的数字
    }

    // 调用 BFS 并输出结果
    cout << bfs() << endl;

    return 0;
}
posted @ 2026-01-10 14:46  AnoSky  阅读(24)  评论(0)    收藏  举报