奇怪的电梯 题目描述 呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第 i ii 层楼(1 ≤ i ≤ N 1 \le i \le N1≤i≤N)上有一个数字 K i K_iK i (0 ≤ K i ≤ N 0 \le K_i \le N0≤K i ≤N)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如: 3 , 3 , 1 , 2 , 5 3, 3, 1, 2, 53,3,1,2,5 代表了 K i K_iK i (K 1 = 3 K_1=3K 1 =3,K 2 = 3 K_2=3K 2 =3,……),从 1 11 楼开始。在 1 11 楼,按“上”可以到 4 44 楼,按“下”是不起作用的,因为没有 − 2 -2−2 楼。那么,从 A AA 楼到 B BB 楼至少要按几次按钮呢?

输入格式 共二行。

第一行为三个用空格隔开的正整数,表示 N , A , B N, A, BN,A,B(1 ≤ N ≤ 200 1 \le N \le 2001≤N≤200,1 ≤ A , B ≤ N 1 \le A, B \le N1≤A,B≤N)。

第二行为 N NN 个用空格隔开的非负整数,表示 K i K_iK i 。

输出格式 一行,即最少按键次数,若无法到达,则输出 -1。

样例 #1 样例输入 #1 5 1 5 3 3 1 2 5 1 2 样例输出 #1 3 1 提示 对于 100 % 100 \%100% 的数据,1 ≤ N ≤ 200 1 \le N \le 2001≤N≤200,1 ≤ A , B ≤ N 1 \le A, B \le N1≤A,B≤N,0 ≤ K i ≤ N 0 \le K_i \le N0≤K i ≤N。

80-------------------------------------------------80

#include using namespace std;

int arr[200]; bool visited[200];

int N, A, B;

bool falg = false;

int dfs(int times, int now) {

if (now == B)
{
	falg = true;
	return times;
}

if (visited[now])
{
	return 9999;
}

visited[now] = true;

int next1 = now + arr[now-1];
int next2 = now - arr[now-1];

int time = times + 1;


int up = 9999, down = 9999;

if (next1 >=1 && next1 <= N )
{
	up =  dfs(time, next1);
}
if (next2 >= 1 && next2 <= N)
{
	down = dfs(time, next2);
}
 
return min(up, down);

}

int main()

{

cin >> N >> A >> B;

for (int i = 0; i < N; i++)
{
	cin >> arr[i];
}

int ans = dfs(0, A);

cout << ((falg == false) ? -1 : ans);

}