奇怪的电梯(BFS)
问题 AF: 奇怪的电梯
时间限制: 1.000 Sec 内存限制: 64 MB
题目描述
有一天桐桐做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第i层楼(1≤i≤N)上有一个数字K;(0≤Ki≤N)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:3 3 1 2 5代表了Ki (K1=3,K2=3,…),从一楼开始。在一楼,按“上,”可以到4楼,按“下”是不起作用的,因为没有-2楼。那么,从A楼到B楼至少要按几次按钮呢?
输入
第1行为三个正整数,表示N,A,B(1≤N≤200,1≤A,B≤N);
第2行为N个正整数,表示Ki。
输出
1行,即最少按键次数,若无法到达,则输出-1。
样例输入 Copy
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;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战