A strange lift HDU - 1548 (BFS)

发布时间 2023-03-23 16:07:57作者: HelloHeBin

题意:第 i 个火车站都有一个数字 Ki (0≤Ki ≤N),火车在第 i 站只能前进Ki 站或后退 Ki 站。火车只能在第 1 站和第 N 站之间行驶。
请问,从第 a 站到第 b 站最少需前进或后退多少次?

分析:利用BFS,将每个站出发能到的所有站都入队,不断更新下去,直到所有站都被到达或者车都停止。这样得到的就是最少的。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 210, INF = 0x3f3f3f3f;
int n, m, a, b, k[N], dis[N];

int bfs(int s, int e) {
    memset(dis, 0x3f, sizeof(dis));
    queue<int> q; q.push(s), dis[s] = 0;
    while (q.size()) {
        int u = q.front(), v; q.pop();
        if (u == e) return dis[u];

        v = u - k[u];
        if (v >= 1 && dis[v] > dis[u] + 1)
            q.push(v), dis[v] = dis[u] + 1;

        v = u + k[u];
        if (v >= 1 && dis[v] > dis[u] + 1)
            q.push(v), dis[v] = dis[u] + 1;
    }
    return -1;
}
int main() {
    while (~scanf("%d%d%d", &n, &a, &b) && n) {
        for (int i = 1; i <= n; i++)
            scanf("%d", &k[i]);
        printf("%d\n", bfs(a, b));
    }
    return 0;
}