一开始参数好像和变量给冲突了,ans初值应该是极大值,这个地方卡住了。
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;
int nn, a, b, ans = 0x7fffffff;
int f[205];
bool vis[205];
bool inup(int m)
{
return (m + f[m] <= nn) && (!vis[m + f[m]]);//不超过顶楼,并且不能重复去同一楼层,否则死循环
}
bool indown(int m)
{
return (m - f[m] >= 1) && (!vis[m - f[m]]);//不超过底楼,并且不能重复去同一楼层,否则死循环
}
void dfs(int n, int sum)//当前走到了几楼,目前多少次可以到达
{
//cout << "Now searching:" << n << " " << sum << endl;//Debug
if (n == b)//到目标楼层
{
ans = min(ans, sum);//由于需要找最小次数,用ans更新每次的最小值
}
if (sum > ans) return;//次数比当前的最小值还大,就没有必要继续搜索了
vis[n] = 1;//到这就说明要继续走,把这层标记为访问过
//cout << "Now searching:" << n << " " << sum << endl;//Debug
if (inup(n))//满足条件就向上走
//if ((n + f[n] <= nn) && (!vis[n + f[n]]))
{
dfs(n + f[n], sum + 1);//到了n+f[n]层了,按钮次数加一
}
if (indown(n))//满足条件就向下走
//if ((n - f[n] >= 1) && (!vis[n - f[n]]))
{
dfs(n - f[n], sum + 1);//到了n-f[n]层了,按钮次数加一
}
vis[n] = 0;//回溯
}
int main()
{
scanf("%d%d%d", &nn, &a, &b);//输入
for (int i = 1; i <= nn; i++)
{
scanf("%d", &f[i]);
}
vis[a] = 1;
dfs(a, 0);//从第a层开始
if (ans != 0x7fffffff) printf("%d", ans);
else printf("-1");
return 0;
}