参数:当前状态+目标量(如步数)
1.判结束(防止开始即结束)
2.dfs一般为最优,所以判断当前目标量若已经不是最优了就直接return,防止没结束的状态(非至目标)对结果影响
3.标记vis防一条路径徘徊
4.按方向搜索
5.回溯
#include<bits/stdc++.h>
using namespace std;
bool vis[300];
int a1[300];
int n;
int a,b;
int ans;
void dfs(int x,int cnt)//位置加目标状态
{
if(x==b)
{
ans=min(ans,cnt);
return ;
}//放开头防止当前就结束
if(cnt>ans)
return ;//防止多当前不管找没找到的都要结束
vis[x]=1;//防止同一路径重复走位置
if(a1[x]+x<=n&&!vis[a1[x]+x])
dfs(a1[x]+x,cnt+1);
if(-1*a1[x]+x<=n&&!vis[-1*a1[x]+x])
dfs(-1*a1[x]+x,cnt+1);
vis[x]=0;//回溯
}
int main ()
{
cin>>n>>a>>b;
for(int i=1;i<=n;++i)
{
cin>>a1[i];
}
ans=0x7ffffff;//32-int max
dfs(a,0);
if(ans<0x7ffffff)
cout<<ans;
else cout<<-1;
return 0;
}
求最优状态量记得初始化为0x7ffffff(int-32max)