题解 洛谷 Luogu P1135 奇怪的电梯 广度优先搜索 BFS C/C++
题目传送门:
P1135 奇怪的电梯 - 洛谷 | 计算机科学教育新生态https://www.luogu.com.cn/problem/P1135思路:
一道比较裸的 BFS,就是把走迷宫每次搜周围相邻四格,改成了楼层每次搜上下方向的某层而已
感觉这个题难度只有普及-
代码:
#include <cstdio>
using namespace std;
const int N = 205;
int n, a, b, arr[N], q[N], head, tail = -1, ans[N];//ans[] 存结果
bool mk[N];//mk[] 标记已走过的楼层。可以将 ans[] memset 为全 -1,ans[i] == -1 就表示没走过
//但是还是多开一个数组比较清晰
int BFS()
{q[++tail] = a;//预处理mk[a] = true;while (head <= tail){int t = q[head++];if (t == b) return ans[t];//找到答案int up = t + arr[t], down = t - arr[t];//两个方向上的某个楼层if (up <= n && mk[up] == false) q[++tail] = up, mk[up] = true, ans[up] = ans[t] + 1;if (down >= 1 && mk[down] == false) q[++tail] = down, mk[down] = true, ans[down] = ans[t] + 1;//楼层合法且没走过就入队}return -1;
}
int main()
{scanf("%d%d%d", &n, &a, &b);for (int i = 1; i <= n; i++) scanf("%d", &arr[i]);printf("%d", BFS());return 0;
}