每一層遍歷的節點都與根節點距離相同。設 di 表示第 i 個節點與根節點的距離,推導出一個結論:對于先遍歷的節點 i 與后遍歷的節點 j,有 di <= dj。利用這個結論,可以求解最短路徑等最優解 問題:第一次遍歷到目的節點,其所經過的路徑為最短路徑。應該注意的是,使用 BFS 只能求解無權圖的最短路徑,無權圖是指從一個節點到另一個節點的代價都記為 1。 在程序實現 BFS 時需要考慮以下問題:
隊列:用來存儲每一輪遍歷得到的節點;
標記:對于遍歷過的節點,應該將它標記,防止重復遍歷;
2. 計算在網格中從原點到特定點的最短路徑長度
題目描述:1 表示可以經過某個位置,求解從(0,0)位置到(tr,tc)位置的最短路徑長度。
publicintminPathLength(int[][] grids,int tr,int tc){finalint[][] direction ={{1,0},{-1,0},{0,1},{0,-1}};finalint m = grids.length, n = grids[0].length;Queue<Pair<Integer, Integer>> queue =newLinkedList<>();queue.offer(newPair<>(0,0));int pathLength =0;while(!queue.isEmpty()){int size = queue.size();pathLength++;while(size-->0){Pair<Integer, Integer> cur = queue.poll();int cr = cur.getKey(), cc = cur.getValue();grids[cr][cc]=0;//標記for(int[] d : direction){int nr = cr + d[0], nc = cc + d[1];if(nr <0|| nr >= m || nc <0|| nc >= n || grids[nr][nc]==0){continue;}if(nr == tr && nc == tc){return pathLength;}queue.offer(newPair<>(nr, nc));}}}return-1;}