解题思路:回溯法,对每一个楼层都有上下两种方法,只要合法(>=1&&<=n)都可以去。结束递归的条件是当前的step大于res,记得回溯修改已经访问的点为未访问。
#include<bits/stdc++.h>
#define MAX 201
using namespace std;
int n,a,b;
int arr[MAX];//存储每一层电梯的数字
int visited[MAX];//该层是否访问过
int flag=0;//是否有解
int res = 1e9;//最小次数
void dfs(int x,int step)//当前楼层和按了几次按钮
{
if(step>res)
{
return;//如果已经被访问过了说明该方法行不通
}
if(x==b)
{
flag=1;
res = step;
return;
}
int temp1 = x-arr[x];
if(temp1>=1&&!visited[temp1])
{
visited[temp1]=1;
dfs(temp1,step+1);
visited[temp1]=0;
}
int temp2 = x+arr[x];
if(temp2<=n&&!visited[temp2])
{
visited[temp2]=1;
dfs(temp2,step+1);
visited[temp2]=0;
}
}
int main()
{
cin>>n>>a>>b;
for(int i=1;i<=n;i++)
{
cin>>arr[i];
}
dfs(a,0);
if(flag==0)
{
cout<<-1<<"\n";
}
else
{
cout<<res<<"\n";
}
return 0;
}