题目描述
题目思路
这道题本质上是图论的最短路径问题。由于问的是最小按按钮次数而不是最短耗时,因此每条边没有权值,就能用宽度优先搜索解决。用数组存储每层楼的
,再从起点开始宽度优先搜索。
我的代码
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
int k[201];
int t[201];
int n;
queue<int> que;
int bfs(int a, int b) {
que.push(a);
while (que.size()) {
//队首元素初始化
int s = que.front();
if (s == b) {
return t[b];
}
que.pop();
if (s + k[s] <= n && t[s + k[s]] == 0) {//状态转移,入队
que.push(s + k[s]);
t[s + k[s]] = t[s] + 1; //次数+1
}
if (s - k[s] > 0 && t[s - k[s]] == 0) {
que.push(s - k[s]);
t[s - k[s]] = t[s] + 1; //次数+1
}
}
return -1;
}
int main() {
int a;
int b;
cin >> n >> a >> b;
for (int i = 1; i <= n; i++)
{
cin >> k[i];
t[i] = 0;
}
cout << bfs(a, b);
return 0;
}