提供两种思路
第一种DFS
超时第九和第十点
import java.util.*;
import java.io.*;
public class Main{
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
static int N,A,B,INF;
static int[] lift;
static int[] distance;
static boolean[] judge;
public static void main(String[] args) throws IOException {
String[] S = br.readLine().split(" ");
N = Integer.parseInt(S[0]);
A = Integer.parseInt(S[1]);
B = Integer.parseInt(S[2]);
INF = 0x3f3f3f3f;
lift = new int[N+1];
judge = new boolean[N+1];
distance = new int[N+1];
Arrays.fill(distance,INF);
S = br.readLine().split(" ");
for(int i = 0 ; i < S.length ; i++) {
lift[i+1] = Integer.parseInt(S[i]);
}
DFS(A , 0);
if(distance[B] == 0x3f3f3f3f) {
out.write("-1");
}
else {
out.write(distance[B] + "");
}
out.flush();
out.close();
br.close();
}
private static void DFS(int layer , int count) {
if(layer == B) {
distance[B] = Math.min(distance[B], count);
return ;
}
if(layer + lift[layer] <= N && !judge[layer+lift[layer]]) {
judge[layer+lift[layer]] = true;
count++;
layer += lift[layer];
DFS(layer , count);
count--;
layer -= lift[layer];
judge[layer+lift[layer]] = false;
}
if(layer - lift[layer] >= 1 && !judge[layer - lift[layer]]) {
judge[layer-lift[layer]] = true;
count++;
layer -= lift[layer];
DFS(layer , count);
count--;
layer += lift[layer];
judge[layer-lift[layer]] = false;
}
}
}
第二种BFS
AC
import java.util.*;
import java.io.*;
public class Main{
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
static int N,A,B;
static int[] lift;
static boolean[] judge;
public static void main(String[] args) throws IOException {
String[] S = br.readLine().split(" ");
N = Integer.parseInt(S[0]);
A = Integer.parseInt(S[1]);
B = Integer.parseInt(S[2]);
lift = new int[N+1];
judge = new boolean[N+1];
S = br.readLine().split(" ");
for(int i = 0 ; i < S.length ; i++) {
lift[i+1] = Integer.parseInt(S[i]);
}
BFS();
out.flush();
out.close();
br.close();
}
private static void BFS() throws IOException {
Point first = new Point();
first.index = A;
first.layer = 0;
Deque<Point> deque = new LinkedList<>();
deque.offer(first);
Point result = first;
while(!deque.isEmpty()) {
result = deque.poll();
if(result.index == B) {
break;
}
if(result.index + lift[result.index] <= N && !judge[result.index + lift[result.index]]) {
Point node = new Point();
node.layer = result.layer + 1;
node.index = result.index + lift[result.index];
judge[result.index + lift[result.index]] = true;
deque.offer(node);
}
if(result.index - lift[result.index] >= 1 && !judge[result.index - lift[result.index]]) {
Point node = new Point();
node.layer = result.layer + 1;
node.index = result.index - lift[result.index];
judge[result.index - lift[result.index]] = true;
deque.offer(node);
}
}
if(result.index == B) {
out.write(result.layer + "");
}
else {
out.write("-1");
}
}
}
class Point{
int layer;
int index;
}