B-BFS
阿新 • • 發佈:2021-08-01
package Week2; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.InputStreamReader; import java.util.LinkedList; import java.util.Queue; import java.util.StringTokenizer; //題意:在同一行,由n到達k,有三種操作,每種操作花費1分鐘:x+1,x-1,x*2。求所需最小時間。 //注不知道N大還是K大,所以N大的時候要減去不能乘以2,所以直接判斷每個數字小於等於10000就好了,跳出條件是N==K跳出迴圈View Code/*農場主約翰已被告知一頭逃亡母牛的位置,並希望立即抓住她。他從N(0)點開始≤ N≤ 100000)且奶牛位於點K(0≤ K≤ 100000)在同一號碼線上。 農夫約翰有兩種交通方式:步行和心靈運輸。 *步行:FJ可以在一分鐘內從任意點X移動到點X-1或X+1 *傳送:FJ可以在一分鐘內從任意點X移動到點2×X。 如果這頭牛沒有意識到它的追趕,根本就不動,農夫約翰要花多長時間才能找回它?*/ public class B_BFS { static int N,K; static boolean visited[]; static int loa[] = new int[]{1,-1,2};static int ans; static Queue<int[]> pq = new LinkedList<int[]>(); public static void main(String[] args) throws Exception { System.setIn(new FileInputStream("Solution.txt")); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st= new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); K = Integer.parseInt(st.nextToken()); visited = new boolean[100001]; pq.clear(); pq.add(new int[]{N,0});//int陣列表示int[0]表示每次移動目標數,int[1]移動的分鐘總數 visited[N]=true; ans = 0; ans = bfs(); System.out.println(ans); } private static int bfs() { while(!pq.isEmpty()) { int[] curr = pq.poll(); for (int i = 0; i < loa.length; i++) { int next = 0; if(loa[i]==1) { next = curr[0]+1;//座標每次移動位置+1 } if(loa[i]==-1) { next = curr[0]-1;//座標每次移動位置-1 } if(loa[i]==2) { next = curr[0]*2;//座標每次移動位置*2 } int num = 0; if(isValid(next) && !visited[next]) { visited[next]=true; num = curr[1]+1;//每移動一步,分鐘數加1 pq.add(new int[] {next,num}); } if(next == K) {//當目標數字等於牛的座標時退出 return num; } } } return 0; } private static boolean isValid(int next) { //注不知道N大還是K大,所以N大的時候要減去不能乘以2,所以直接判斷每個數字小於等於10000就好了,跳出條件是N==K跳出迴圈 if(next >=0 && next<=100000) { return true; } return false; } }