解法二用到递推思想
#include <iostream>
using namespace std;
bool f[10000][205];//f[i][j]表示目前搜索了i次,在第j层,f[i][j]=1就表示第i层可以到达
int c[205];//表示每一层的按钮数字
int main()
{
int n, a, b;
cin >> n >> a >> b;
for (int i = 1; i <= n; i++)
{
cin >> c[i];
}
f[0][a] = 1;//初始值
if (a == b)//特判初始楼层和需要到达的楼层一样
{
cout << "0" << endl;
return 0;
}
for (int i = 0; i <= 200; i++)
{
for (int j = 1; j <= n; j++)
{
if (f[i][j] == 1 && j + c[j] <= n)//如果当前楼层可被搜到,并且电梯往上不会超过顶层
{
f[i + 1][j + c[j]] = 1;//把向上的楼层标记为可到达
}
if (f[i][j] == 1 && j - c[j] >= 1)//如果当前楼层可被搜到,并且电梯往下不会低于一层
{
f[i + 1][j - c[j]] = 1;//把向下的楼层标记为可到达
}
if (f[i + 1][b] == 1)//如果目标楼层被标记了,可以到达了,就输出,并且终止
{
cout << i + 1 << endl;
return 0;
}
}
}
cout << "-1" << endl;//搜不到就输出-1
return 0;
}