P1135 奇怪的电梯复盘

P1135 奇怪的电梯 题解复盘

基本信息

项目内容
题目编号、来源P1135 洛谷 / 奇怪的电梯
训练层级B BFS基础
知识版块BFS、状态搜索、一维最短路

解题前・关键信号识别

维度分析
目标、约束、底层结构目标:从 A 楼到 B 楼的最少按键次数;约束:N ≤ 200;底层结构:把每一层楼看作一个节点,从 i 层可以到达 i+K[i] 层和 i-K[i] 层,求无权图最短路。
数据规模N ≤ 200,BFS 完全可行。
候选算法和依据BFS;依据:求最少步数 = 无权图最短路,用 BFS 逐层扩散。
复杂度预判时间复杂度 O(N),空间复杂度 O(N)。

解题后・外化复盘

维度内容
实现结构 / 核心思路第一步用map<int,int> m存储每层楼的数字(也可用数组);第二步定义v[205]记录到达每层楼的最少按键次数,初始化为 -1;第三步从起点 A 开始 BFS,队列存储楼层号;第四步每次取出队首 x,计算y = x + m[x](向上)和z = x - m[x](向下),若在 1~N 范围内且未访问,则入队并记录v[next] = v[x] + 1;第五步输出v[B]核心思想:把电梯问题转化为一维图上的 BFS 最短路,每个节点最多两个分支。
错因回溯1. 忘记初始化v数组为 -1;2. 向上/向下越界判断写错(y<=nz>0);3. 用 DFS 搜索导致超时或栈溢出;4. 没有处理无法到达的情况(输出 -1,因为v[B]仍为 -1)。
边界和易错点1.m[i]可能为 0,此时向上和向下都到同一层(或原地不动),需要正确处理;2. 起点 A 可能等于终点 B,此时答案为 0;3. 楼层范围是 1~N,不是 0~N-1;4. 入队时立即标记访问。
下次看到什么信号,我应该想到这个方法看到「最少步数 + 状态转移固定 + 图/网格/一维」,用 BFS。

AC 完整代码(按你提供的代码)

#include<iostream>#include<cstring>#include<queue>#include<algorithm>#include<set>#include<vector>#include<map>usingnamespacestd;intn,a,b;map<int,int>m;intv[205];voidbfs(inta){queue<int>q;memset(v,-1,sizeof(v));q.push(a);v[a]=0;while(!q.empty()){intx=q.front();q.pop();inty=x+m[x];intz=x-m[x];if(y<=n&&v[y]==-1){q.push(y);v[y]=v[x]+1;}if(z>0&&v[z]==-1){q.push(z);v[z]=v[x]+1;}}}intmain(){cin>>n>>a>>b;for(inti=1;i<=n;i++){intx;cin>>x;m[i]=x;}bfs(a);cout<<v[b]<<endl;return0;}