package solution; import java.util.Scanner; import java.util.Stack; public class Jump { static boolean found=false; static int count=0; public static void main(String[] args) { Scanner sc=new Scanner(System.in); int N=sc.nextInt(); for(int cases=1;cases<=N;cases++){ int len=sc.nextInt(); int s=sc.nextInt()-1; int f=sc.nextInt()-1; int steps[]=new int[len]; for(int k=0;k<len;k++){ steps[k]=sc.nextInt(); } Stack<Integer> t=new Stack<Integer>(); Stack<Integer> q=new Stack<Integer>(); found=false; count=0; Jump j=new Jump(); j.findtarget(steps, s, f, t,q); if(found){ System.out.println("#"+cases+" "+(count)); for(int i=0;i<t.size();i++){ // print path //System.out.println(t.get(i)); } }else{ System.out.println("#"+cases+" -1"); } } sc.close(); } public void findtarget(int steps[],int s,int f,Stack<Integer> t,Stack<Integer> q){ if(checkbound(steps,s)&&!found) { //left if((s>1)&&checkbound(steps,s-steps[s])&&!q.contains(s)&&!q.contains(s-steps[s])&&!found){ t.add(s-steps[s]); q.add(s); count++; if(t.peek()==f){ found=true; }else{ findtarget(steps,t.peek(),f,t,q); } } else //right if((s<steps.length)&&checkbound(steps,s+steps[s])&&!q.contains(s)&&!q.contains(s+steps[s])&&!found){ t.add(s+steps[s]); q.add(s); count++; if(t.peek()==f){ found=true; }else{ findtarget(steps,t.peek(),f,t,q); } } } } public static boolean checkbound(int setpn[],int p){ boolean r=true; if( p>setpn.length || p<0) r=false; return r; } } /* 例如 有10个 整数 1 4 2 2 4 3 6 7 10 5 从第3个数开始 可以左右跳, 第三个数对应的值是2,所以可以向左或者向右跳2个位置, 比如向左跳2个位置,到达第1个数, 求 要到达数字6 要跳多少次? 如果没有到达最终的数字的可以打印 -1,如果有打印 次数。 给出下面5组用例, 以及每个用例包含的数字,和 开始位置 结束位置。 5 4 2 3 1 6 1 1 4 2 3 1 2 2 2 4 2 3 1 2 2 1 10 3 6 1 4 2 2 4 3 6 7 10 5 100 1 100 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 #1 -1 #2 -1 #3 2 #4 3 #5 99 */
时间: 2024-10-07 02:20:29