使用廣度優先搜索,計算路徑最短問題

問題,求出任意兩個站點間的最短距離

廣度優先搜索可解決的問題

  1. 從A節點可否到達B節點java

  2. 從A節點到達B節點的最短路徑code

廣度優先搜索的原理

先搜索A節點的全部子節點,過沒有找到結果,再從每一個子節點的字節點搜索。如此反覆。blog

注意:必須按順序從全部一級節點開始搜索,再從二級節點,三級節點,以此類推。隊列

參考原理圖

代碼實現

對站點建模

static{
        //對站點建模
        map = new HashMap<>();
        map.put("A",new String[]{"B","D"});
        map.put("B",new String[]{"A","F"});
        map.put("C",new String[]{"E","G"});
        map.put("D",new String[]{"A","G"});
        map.put("E",new String[]{"C","I"});
        map.put("F",new String[]{"B","H"});
        map.put("G",new String[]{"C","D","I"});
        map.put("H",new String[]{"F","K"});
        map.put("I",new String[]{"E","K"});
        map.put("J",new String[]{"K"});
        map.put("K",new String[]{"J","H","I","N"});
        map.put("N",new String[]{});
    }

由於是任意兩個相鄰站點均可以來回,因此每一個站點都是相互的子節點。字符串

若是有單向的站點,建模時,只設置成一方的子節點。get

代碼

public static void shortestWay(Map<String,String[]> map,String start,String end){
        Queue<String> queue = new ArrayDeque();
        //將起始元素的全部子元素加入隊列
        addStringArr(queue,start);
        //最短路徑可能有多個,設置一個標誌,記錄最短路徑的長度    
        int i = 0;
        while(true) {
            //每次從隊列彈出隊首的元素
            String s = queue.poll();
            //比較字符串最後一個字符
            if (end.equals(String.valueOf(s.charAt(s.length()-1)))) {
                if(i == 0) i = s.length();  // 第一次找到最短路徑,記錄長度
                if(s.length > i) return ;   //長度大於最短路徑長度時,結束
                System.out.println(start+"節點到"+end+"節點的最短路徑是:"+s);
            } else {
                //結果不匹配,把該元素的全部子元素加到隊尾
                addStringArr(queue, s);
            }
        }

    }
    // 將元素s的全部相鄰元素加入隊列尾部
    public static void addStringArr(Queue<String> queue,String s ){
        //每次取字符串最後一個字符
        for (String str  : map.get(String.valueOf(s.charAt(s.length()-1))) ){
            //每次把子元素加入尾部時,在字符串前面拼接本身。
            str = s+str;
            queue.add(str);
        }
    }

爲了在結果中顯示出最短路徑。如A節點到I節點的最短路徑時:ADGIclass

每次將子元素加入隊列尾部時,在子元素字符串前面加上父元素字符串。test

在比較結果時,取元素的最後一個字符比較。原理

運行效果

相關文章
相關標籤/搜索