这题是一道bfs的标准题,但是也可以用dfs求解
dfs求解需要剪枝,不然会超时,同时还要考虑这道题找不到输出-1的这个因素
首先,用深搜解决,深搜函数部分就两个大操作,搜索与相对应的题目计算,每到一层楼就搜索那一层楼的两种情况,并用一个辅助数组来记录剪枝
至于怎么剪枝
我们可以让辅助数组记录每次走到的位置我们的操作步数,下次走到这个位置时我们的操作数必须小于最小的那个,建议看代码
#include <bits/stdc++.h>
using namespace std;
int n,k[205];
int x;//x来储存每次的那个答案
int a,b;
int mapv[205];//剪枝
void dfs(int x,int u)//x代表搜索的楼层,u代表操作数(也就是步数)
{
mapv[x] = u;
if((x-k[x]) >= 1 && u+1 < mapv[x-k[x]]/*必须是第一次走到*/)
{
dfs(x-k[x],u+1);
}
if((x+k[x]) <= n && u+1 < mapv[x+k[x]])
dfs(x+k[x],u+1);
}
int main()
{
ios::sync_with_stdio(false);//加快cin,cout速度
cin.tie(0);
cout.tie(0);
cin >> n >> a >> b;
memset(mapv,0x3f,sizeof(mapv));//初始化最大值
for(int i = 1; i <= n; i++)
{
cin >> k[i];
}
dfs(a,0);
cout << (mapv[b] == 0x3f3f3f3f?-1:mapv[b]);
return 0;
}