提供两种思路
第一种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;
}