思路
BFS
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
bool Flag[225]={0},F[225][225];
//Flag表示i点是否走过
//F表示i点后退j步有没有走过
int m,Height[500];
int main()
{
scanf("%d",&m);
for(int i=1;i<=m;i++)
scanf("%d",&Height[i]);
queue<int>Ladder;//表示第几个台阶
queue<int>Step;//表示可以上多高的台阶
queue<int>Back;//表示后退了多少步
queue<int>Num;//表示用了多少步
Ladder.push(1);
Step.push(1);
Back.push(0);
Num.push(0);
Flag[1]=1;
while(Ladder.size())
{
int L=Ladder.front();Ladder.pop();
int S=Step.front();Step.pop();
int B=Back.front();Back.pop();
int N=Num.front();Num.pop();
for(int i=L+1;i<=m;++i)//前进
if(Height[L]+S>=Height[i]
&& !Flag[i])
{
Ladder.push(i);
Num.push(N+1);
Step.push(1);
Back.push(0);
Flag[i]=1;
if(i==m)
{
printf("%d",N+1);
return 0;
}
}
if (!F[L-1][B+1] && L>1)//后退
{
Ladder.push(L-1);
Step.push(2*S);
Back.push(B+1);
Num.push(N+1);
F[L-1][B+1]=1;
}
}
printf("-1\n");
return 0;
}