题意:第 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;
}
标签:int,Ki,strange,BFS,lift,&&,push,dis
From: https://www.cnblogs.com/hellohebin/p/17247849.html