急先锋开宝箱问题(Java实现)
開寶箱(Java8)
我在參與騰訊校招機考的時候做過類似的題(當然比這個難了),是寶箱和鑰匙匹配的題,所以想找個類似的題目做做,然后就搜到這題,對于算法效率和能不能通過測試我不清楚,因為沒有找到題目來源,java代碼僅供參考。c/c++解法參考
Description:
急先鋒是一個商人,有一天找到了一個寶箱,寶箱需要正確的密碼才能打開。同時他發現寶箱上有一個數字,和一份密碼表。密碼表上有n個密碼,只有一個密碼是正確的。
急先鋒所在的島上有m個地點,每個地點有兩個神秘的數字。他通過交易得到每個地點上擁有的信息,也知道這個寶箱上的數字是一個地點的標號x。急先鋒需要先到x號地點,x號地點上的第一個數字就是他要去的最終地點的標號,最終的地點上的第二個數字就是密碼在密碼表上的序號。急先鋒想要知道打開這個寶箱的密碼,聰明的你能不能直接告訴他呢?
Input:
第一行兩個數字n,m.(1<=n,m<=20)
接下來n個數字ai表示密碼表上序號1到序號n的密碼分別是多少。(1 <=ai<=100)
接下來m行每行兩個數字u,v。(1 <= u<=m,1<= v <=n)
然后給你一個T,表示T次詢問。(1<=T<= 20)
接下來的T行每行一個x,表示寶箱上的數字。(1<=x<=m)
Output:
一共T行。每行一個數字表示最后的密碼。
Sample Input
5 4
1 2 3 4 5
2 4
3 3
1 2
2 5
2
1
2
Sample Output
3
2
題目解析:根據題意和測試用例可知,T行數的每一行代表一個寶箱上的數,寶箱上的數代表地點,地點里第一個數u[i]代表最終地點,最終地點的第二個數v[i]代表密碼在密碼表a[i]上的位置即索引,所以可得a[ v[ u[ x[ ] ] ] ] 即為寶箱密碼。
下附上java8偽代碼:
import java.util.Scanner; public class Main{public static void main(String[] args){Scanner in = new Scanner(System.in);int n = in.nextInt();//鍵盤輸入nint m = in.nextInt();//鍵盤輸入mint[] a = new int[n];//數字a存放密碼表int[] u = new int[n];//數組u存放地點x第一個數int[] v = new int[v];//數組v存放地點x第一個數for (int i = 0;i < n;i++){a[i] = in.nextInt();//輸入密碼表}for (int j = 0;j < m;j++){u[j] = in.nextInt();//輸入地點x第一個數v[j] = in.nextInt();//輸入地點x第二個數}int T = in.nextInt();//輸入詢問次數Tint[] x = new int[T];//數組x存放寶箱上的數字for (int k = 0;k < T;k++ ){x[k] = in.nextInt();//輸入寶箱上的數組}for (int k = 0;k < T;k++ ){/*因為數組洗標是從0開始的,但輸入數是從1開始的自然數所以此處-1*/int p =a[v[u[x[k]-1]-1]-1];//用p存儲密碼System.out.println(p);//輸出密碼}} }輸入輸出結果如下:最后兩行為輸出
5 4 1 2 3 4 5 2 4 3 3 1 2 2 5 2 1 2 3 2下附上int p =a[ v[ u[x[ k ] ] ] ]結果的實現偽代碼:
import java.util.Scanner public class Main{public static void main(String[] args){Scanner in = new Scanner(System.in);int n = in.nextInt();//鍵盤輸入nint m = in.nextInt();//鍵盤輸入mint[] a = new int[n+1];//數字a存放密碼表int[] u = new int[n+1];//數組u存放地點x第一個數int[] v = new int[m+1];//數組v存放地點x第一個數for (int i = 1;i <=n;i++){a[i] = in.nextInt();//輸入密碼表}for (int j = 1;j <= m;j++){u[j] = in.nextInt();//輸入地點x第一個數v[j] = in.nextInt();//輸入地點x第二個數}int T = in.nextInt();//輸入詢問次數Tint[] x = new int[T];//數組x存放寶箱上的數字for (int k = 0;k < T;k++ ){x[k] = in.nextInt();//輸入寶箱上的數組}for (int k = 0;k < T;k++ ){int p =a[v[u[x[k]]]];//用p存儲密碼System.out.println(p);//輸出密碼}} }總結
以上是生活随笔為你收集整理的急先锋开宝箱问题(Java实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常见几个排序源码及二分查找源码
- 下一篇: 不用梯子——每日领取5块钱的ChatGP