码蹄杯 迷宫挑战 题型:bfs() 难度:钻石

64 阅读1分钟

码题集OJ-迷宫挑战 (matiji.net)

边界

假设起始点是第五层,第五层的k值是5,那么就只能向上跳,不能向下跳,因为会越界. image.png

#include <bits/stdc++.h>
using namespace std;
int n, A, B;
const int N = 1e6 + 10;
int k[N], dist[N];
vector<int> g[N];  //表示从当前层可以走到的层
queue<int>q;

int main() {
	cin >> n >> A >> B;

	for (int i = 1; i <= n; i++) {
		cin >> k[i];

		//从第i层向上可以走到哪一层,向下可以走到哪一层
		if (i + k[i] <= n)
			g[i].push_back(i + k[i]);
		if (i - k[i] > 0)
			g[i].push_back(i - k[i]);
	}




	q.push(A);
	while (!q.empty()) {
		int u = q.front();
		q.pop();

		//遍历队头层可以到达的层
		for (int i =0; i < g[u].size(); i++) {
			int v = g[u][i]; //从队头层可以走到的层
			if (dist[v]) //如果已经走过
				continue;

			dist[v] = dist[u] + 1; //走到当前层 步数+1
			q.push(v);
		}
	}

	if (dist[B])
		cout << dist[B] << endl;
	else
		cout << "-1" << endl;

	return 0;
}

image.png