從A節點可否到達B節點java
從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
在比較結果時,取元素的最後一個字符比較。原理