代码如下:
#include<queue>
#include<iostream>
using namespace std;
int main()
{
int num=1;
while (scanf("%d", &num) && num)
{
queue<int> disp;
int fir = 0, end = 0;
int arr[209] = { 0 };
int visit[209] = { 0 };
int floor[209] = { 0 };
// 初始化队列
while (!disp.empty()) disp.pop();
// 起终点
scanf("%d%d", &fir,& end);
// 输入num个系数
for (int i = 1; i <= num; i++)
scanf("%d", &arr[i]);
// 初始化标记数组
for (int i = 0; i <= num; i++)
visit[i] = 1;
disp.push(fir);
int k = 0, node = 0,node1=1;
while (!disp.empty())
{
// 初始化接下来该层有效结点
node = 0;
// 上层对应有多少个子点(作为该层的夫点),就遍历多少个点
// 对每个结点做判断 并 加入左右子点的操作
for (int i = 0; i < node1; i++)
{
int temp = disp.front();
// 如果和目标值一致输出
if (temp == end) {
cout << k << endl;
while (!disp.empty()) disp.pop();
break;}
// 做标记
visit[temp] = 0;
// 弹出结点
disp.pop();
// 计算上下楼层
int up = temp + arr[temp];
int down = temp - arr[temp];
// 上层楼层<=num,且如果上层楼层未标记,加入队列,有效点数加一
if (up <= num && visit[up])
{
disp.push(up); node++;
}
// 下层楼层>=1,且如果下层楼层未标记,加入队列,有效点数加一
if (down >= 1 && visit[down])
{
disp.push(down); node++;
}
// 如果队列为空退出
if (disp.empty()) {
cout << -1 << endl;
while (!disp.empty()) disp.pop();
break;
}
}node1 = node;// 该层结点数作为下层的父点
k++; // 计算按钮次数
}
}
return 0;
}