150 likes | 417 Views
DFS 與 BFS. 圖形結構儲存方式. Breadth-first search (BFS) 廣度優先搜尋法. 依序走訪同一層的所有節點,走訪完畢後,才繼續走訪下一層的節點 BFS 會使用到 queue ( 佇列 -- 先進先出 ) 來紀錄過程中展開的節點. 1. 1. 2. 3. 2. 3. 5. 4. 6. 4. 5. 6. 7. 8. 8. 7. BFS 演算法. Step 1: From a 1-element queue consisting of the root node // 從包含根節點的佇列開始
E N D
Breadth-first search (BFS)廣度優先搜尋法 • 依序走訪同一層的所有節點,走訪完畢後,才繼續走訪下一層的節點 • BFS 會使用到queue (佇列--先進先出) 來紀錄過程中展開的節點 1 1 2 3 2 3 5 4 6 4 5 6 7 8 8 7
BFS 演算法 Step 1: From a 1-element queue consisting of the root node // 從包含根節點的佇列開始 Step 2: Test to see if the first element in the queue is a goal node. If it is, stop; otherwise, go to step 3. // 測試佇列的第一個元素是否為目標,若是,則停止, 否則, 做step 3. Step 3: Remove the first element from the queue. Add the first element’s descendants, if any, to the end of the queue . //移除第一個元素, 加入其子代到佇列的末端 Step 4: If the queue is empty, then failure. Otherwise, go to step 2 //若佇列是空的,則失敗;否則 作 step 2
Depth-first search (DFS) 縱度優先搜尋法 • 先走訪越深的子節點, 直到該點沒有子節點後,回溯到最近尚有未走訪子節點的節點,再繼續下訪其他節點 • DFS 會使用到Stack (堆疊—後進先出) 來紀錄過程中展開的節點 1 1 2 7 2 3 4 3 8 4 5 6 7 8 6 5
DFS 演算法 Step 1: From a 1-element stack consisting of the root node // 從包含根節點的堆疊開始 Step 2: Test to see if the top element in the stack is a goal node. If it is, stop; otherwise, go to step 3. // 測試堆疊的頂端元素是否為目標,若是,則停止, 否則, 做step 3. Step 3: Remove the top element from the stack and add the first element’s descendants, if any, to the top of the stack . //移除堆疊頂端元素, 加入其子代到堆疊的頂端 Step 4: If the stack is empty, then failure. Otherwise, go to step 2 //若堆疊是空的,則失敗;否則 作 step 2
Depth-first search (DFS) 解題範例 • 2007 NPSC決賽試題 格子編號
8 0 8 2 2 7 8 8 7 8 7 2 7 2 2 2 7 2 8 8 2 7 7 2 8 8 7 6 5 4 5 6 6 4 4 4 5 0 0 4 5 0 6 4 4 5 6 5 7 5 6 4 4 5 0 6 3 3 5 0 1 3 0 1 1 1 1 1 3 6 1 6 3 1 0 3 3 0 1 3 3 1 2 A
列出移動規則 0:右、下 1:左、右、下 2:左、下 3:上、右、下 4:左、右、上、下 5:上、左、下 6:上、右 7:上、左、右 8:上、左 • 若目前是往上(下)移動,則 下一次的移動不可往下(上) , 以避免重覆走訪,例如上圖 A走訪。 上:3~8 下:0~5 左:1、2、4、5、7、8 右:0、1、3、4、6、7
Breadth-first search (BFS)解題範例 老鼠找食物(廣度搜尋) 迷宮裡飢腸轆轆的老鼠得到一張地圖,上面記載了迷宮地圖、目前所在位置、及所有食物所在位置。 老鼠在迷宮裡只能上下左右移動,一次移動一格,並且不能超過邊界。 請依照距離由近到遠,列出牠從目前位置到每一個可以到得了的食物所在點,所需移動的最小步數。 輸入: 輸入檔案第一行的兩個整數代表地圖的大小(M, N) (0<M, N <80, M不一定等於N)。 第二行以後有M行(每行N個)字母記載地圖的組態。 字母B代表不能穿越的障礙物; 字母C代表可自由移動的空間; 字母R代表老鼠現在所在位置; 字母F代表食物所在位置(可以穿越)。 輸出: 在每行印出食物所在座標(左下角原點的座標為(0,0),橫向為X,縱向為Y)及老鼠走到此座標所需步數。 依步數由小到大印出。若步數相同,印出順序不限。 範例一: 輸入: 5 5 BCBBC CFCCB BCBBC RCCBF BCCCC 輸出: (1,3) 3 (4,1) 6
B C B B C C F C C B B C B B C R C C B F B C C C C 4 3 2 1 0 R(0,1) B(0,2) C(1,1) B(0,0) 0 1 2 3 4 C(0,3) C(1,2) R(0,1)