最新文章
这里会显示最新的几篇文章摘要。
记录生活,分享知识,与你一起成长。
这里会显示最新的几篇文章摘要。
时间限制: 1.000 Sec 内存限制: 64 MB
3 3 1 2 5```
### 样例输出 Copy
```3```
### 提示
上述答案得到方式如下:
从1楼按上,上到4楼
在4楼按下,到达2楼
在2楼按上,到达5楼
共3步
---
好多地方忘了:(
```cpp#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
short ki[205], vis[205];//bfs需要标记访问,剪枝,否则会爆内存
int main() {
short n, a, b;
cin >> n >> a >> b;
memset(vis, 0, sizeof(vis)); // 正确初始化 vis
for (int i = 1; i <= n; i++) cin >> ki[i]; // 1-based 读取数据
queue<short> q;
q.push(a);
vis[a] = 1; // 标记起点已访问
int ans = 0;
while (!q.empty()) {
int sz = q.size(); // 记录当前层的节点数
while (sz--) {
short loc = q.front();
q.pop();
if (loc == b) {//输出条件
cout << ans;
return 0;
}
// 向上跳
if (loc + ki[loc] <= n && vis[loc + ki[loc]] == 0) {
q.push(loc + ki[loc]);
vis[loc + ki[loc]] = 1; // 访问标记,,放入队列就需要标注,不然会再次放入
}
// 向下跳
if (loc - ki[loc] >= 1 && vis[loc - ki[loc]] == 0) {
q.push(loc - ki[loc]);
vis[loc - ki[loc]] = 1; // 访问标记
}
}
ans++; // 只有当前层遍历完才加 1
}
cout << -1; // 无法到达
return 0;
}