算法思路:dfs, bfs, spfa, floyd等方法都可做出,本文用的是图的广度优先遍历:邻接表+手写队列实现
- 用邻接表存储每个点可以到达的楼层
- 用图的广度优先遍历遍历得到次数
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 210, M = 420;
int h[N], e[M], ne[M], idx; //创建邻接表
int n, a, b, q[N], d[N]; //d数组用于存储电梯运行次数,q数组为手写队列
void add(int a, int b) //添加进邻接表的函数
{
e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
int bfs()
{
memset(d, -1, sizeof d); //初始化所有距离为-1
int hh = 0, tt = 0; //队列的队头和队尾
q[0] = a, d[a] = 0; //a点入队,a点到a点的次数为0
while(hh <= tt)
{
int t = q[hh++]; //取出队列第一个元素
for(int i = h[t]; i != -1; i = ne[i]) //遍历这个元素能到达的点
{
int j = e[i];
if(d[j] == -1) //如果没有遍历到
{
d[j] = d[t] + 1; //更新距离
q[++tt] = j; //将元素添加进队列
}
}
}
return d[b];//返回到b的乘坐次数
}
int main(void)
{
memset(h, -1, sizeof h); //初始化所有邻接表表头为-1
cin >> n >> a >> b;
for(int i = 1; i <= n; i++)
{
int x;
cin >> x;
if(i - x > 0) add(i, i - x); //如果符合条件,添加至邻接表中
if(i + x <= n) add(i, i + x);
}
cout << bfs() << endl;
return 0;
}