题目背景
题目链接:P1135 奇怪的电梯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目描述
呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第 𝑖i 层楼(1≤𝑖≤𝑁1≤i≤N)上有一个数字 𝐾𝑖Ki(0≤𝐾𝑖≤𝑁0≤Ki≤N)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如: 3,3,1,2,53,3,1,2,5 代表了 𝐾𝑖Ki(𝐾1=3K1=3,𝐾2=3K2=3,……),从 11 楼开始。在 11 楼,按“上”可以到 44 楼,按“下”是不起作用的,因为没有 −2−2 楼。那么,从 𝐴A 楼到 𝐵B 楼至少要按几次按钮呢?
输入格式
共二行。
第一行为三个用空格隔开的正整数,表示 𝑁,𝐴,𝐵N,A,B(1≤𝑁≤2001≤N≤200,1≤𝐴,𝐵≤𝑁1≤A,B≤N)。
第二行为 𝑁N 个用空格隔开的非负整数,表示 𝐾𝑖Ki。
输出格式
一行,即最少按键次数,若无法到达,则输出 -1
。
输入输出样例
输入
5 1 5 3 3 1 2 5
输出
3
说明/提示
对于 100%100% 的数据,1≤𝑁≤2001≤N≤200,1≤𝐴,𝐵≤𝑁1≤A,B≤N,0≤𝐾𝑖≤𝑁0≤Ki≤N。
本题共 1616 个测试点,前 1515 个每个测试点 66 分,最后一个测试点 1010 分。
Java题解
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static int n, a, b;
static int[] k, dis;
static void dfs(int node, int step) {
dis[node] = step; // 一定可以更新
int v = node - k[node];
if (1 <= v && step + 1 < dis[v]) /*可以更新在搜索*/ // 下
dfs(v, step + 1);
v = node + k[node];
if (v <= n && step + 1 < dis[v]) // 上
dfs(v, step + 1);
return;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
a = scanner.nextInt();
b = scanner.nextInt();
k = new int[n + 1];
dis = new int[n + 1];
Arrays.fill(dis, Integer.MAX_VALUE);
for (int i = 1; i <= n; i++)
k[i] = scanner.nextInt();
dfs(a, 0);
System.out.println((dis[b] == Integer.MAX_VALUE ? -1 : dis[b]));
}
}