生活随笔
收集整理的這篇文章主要介紹了
华为OD机试107-跳格子游戏
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原始題目鏈接可以參考如下鏈接?某廠機試算法刷題一覽_@_南先森的博客-CSDN博客
在閱讀代碼時,建議拷貝到idea或者eclipse里面看,為了便于理解代碼,注釋比較多,
在閱讀代碼時,可以先刪掉注釋
這個題目需要用到棧做廣度優先搜索,解題主要有以下幾個要點
1:要找到沒有依賴關系的數字作為起始數字,從起始數字出發
像多米諾骨牌一樣往后面的數字傳遞,依次解鎖后面數字
2:使用Map<Integer, List<Integer>>數據結構來記錄
數字之間的依賴關系,value依賴key
3:需要用到Stack,可以解鎖的數字入棧,用出棧來模擬解鎖過程
public class Demo107 {//測試代碼public static void main(String[] args) {int n = 6;int[][] grids = {{0, 1}, {0, 2}, {0, 3}, {0, 4}, {0, 5}};boolean r = skipGrid(n, grids);System.out.println(r);}/** n代表總共幾個數字* grids存放每一行的兩個數字* 舉個例子,如果用戶輸入下面的數據* 2* 1 0* 0 1* 那么n = 2 grids = {{1,0},{0,1}}**/public static boolean skipGrid(int n, int[][] grids) {/** x數組的設計很有講究,其索引代表需要解鎖的數字,其值代表依賴數字* 如國值為null,說明當前數字無依賴數字,可以直接解鎖,下面舉2個例子* 便于理解* 如果用戶輸入* 2* 1 0* 0 1* 那么x=[1,0]* 觀察上面的數據,可以看到 x[0] = 1; x[1] = 0* 以上是索引0依賴數字1,索引1依賴數字0* 再舉個例子* 3* 0 1* 0 2* 則x=[null,0,0]* 觀察上面的數據,可以看到 x[0] = null; x[1] = 0; x[2] = 0* 說明索引0沒有依賴數字,可以直接解鎖.而索引1,2都依賴0**/Integer[] x = new Integer[n];// key和value都存放的是數字,key可以解鎖valueMap<Integer, List<Integer>> map = new HashMap<>();for (int i = 0; i < grids.length; i++) {int[] a = grids[i];List<Integer> list = map.getOrDefault(a[0], new ArrayList<>());list.add(a[1]);map.put(a[0], list);// 理解了上面的注釋,這行代碼就好理解,簡單說,就是記錄索引依賴的數字x[a[1]] = a[0];}Stack<Integer> stack = new Stack<>();//值為空的找出來,值為空說明沒有依賴關系,可以直接解鎖for (int i = 0; i < x.length; i++) {if (x[i] == null) {stack.add(i);}}//如果所有的數字都有依賴關系,說明沒法解鎖if (stack.isEmpty()) {return false;}while (!stack.isEmpty()) {// 一個個彈出,然后賦值為-1,代表已經解鎖過了.后面不要重復訪問解鎖過的元素int index = stack.pop();x[index] = -1;// 獲取以index為前提條件的數字,因為index解鎖了,那么以index為前提條件的數字也可以解鎖List<Integer> list = map.get(index);if (list == null) {continue;}list.forEach(item -> {// 等于 -1說明已經解鎖過了,不需要重復解鎖,避免死循環if (x[item] != -1) {stack.add(item);}});}for (int i = 0; i < x.length; i++) {if (x[i] != -1) {return false;}}return true;}
}
總結
以上是生活随笔為你收集整理的华为OD机试107-跳格子游戏的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。