遍歷查找跳格子邏輯
阿新 • • 發佈:2017-05-18
jump println args 左右 pat log boolean exti import
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 */
遍歷查找跳格子邏輯