Ruby @ NTUIMCP 2022
Ruby@NTUIMCP
暑期訓練
最短路徑
Shortest Path
淹水問題
Flood Fill Problem
Ruby@NTUIMCP
淹水問題
Flood Fill Problem
暑期訓練
Ruby@NTUIMCP
淹水問題 Flood Fill Problem
Ruby@NTUIMCP
暑期訓練 > 淹水問題
淹水問題 Flood Fill Problem
1
2
3
4
Ruby@NTUIMCP
暑期訓練 > 淹水問題
淹水問題 Flood Fill Problem
Depth-First Search (DFS)
深度優先搜尋
Breadth-First Search (BFS)
廣度優先搜尋
How to flood fill?
該如何淹水?
Ruby@NTUIMCP
暑期訓練 > 淹水問題
深度優先搜尋 Depth-First Search
深度優先搜尋,顧名思義:
以深度為優先進行「淹水擴散」
Ruby@NTUIMCP
優先擴散最「新」水源
暑期訓練 > 淹水問題
深度優先搜尋 Depth-First Search
以 3x3 庭院示範:
Ruby@NTUIMCP
暑期訓練 > 淹水問題
深度優先搜尋 Depth-First Search
以 3x3 庭院示範:
2
3
4
1
1
Ruby@NTUIMCP
暑期訓練 > 淹水問題
深度優先搜尋 Depth-First Search
以 3x3 庭院示範:
2
4
2
4
3
1
2
Ruby@NTUIMCP
暑期訓練 > 淹水問題
深度優先搜尋 Depth-First Search
以 3x3 庭院示範:
4
2
4
3
3
1
2
3
Ruby@NTUIMCP
暑期訓練 > 淹水問題
深度優先搜尋 Depth-First Search
以 3x3 庭院示範:
4
2
4
3
3
1
2
3
4
Ruby@NTUIMCP
暑期訓練 > 淹水問題
深度優先搜尋 Depth-First Search
以 3x3 庭院示範:
4
2
4
3
4
1
2
3
4
5
Ruby@NTUIMCP
暑期訓練 > 淹水問題
深度優先搜尋 Depth-First Search
以 3x3 庭院示範:
4
2
4
3
4
1
2
3
4
5
6
Ruby@NTUIMCP
暑期訓練 > 淹水問題
深度優先搜尋 Depth-First Search
以 3x3 庭院示範:
4
2
4
3
1
2
3
4
5
6
1
7
Ruby@NTUIMCP
暑期訓練 > 淹水問題
深度優先搜尋 Depth-First Search
以 3x3 庭院示範:
4
2
4
3
1
2
3
4
5
6
7
8
1
Ruby@NTUIMCP
暑期訓練 > 淹水問題
深度優先搜尋 Depth-First Search
以 3x3 庭院示範:
4
2
4
3
1
2
3
4
5
6
7
8
9
Ruby@NTUIMCP
暑期訓練 > 淹水問題
深度優先搜尋 Depth-First Search
以 3x3 庭院示範:
4
2
4
3
1
2
3
4
5
6
7
8
9
Ruby@NTUIMCP
暑期訓練 > 淹水問題
深度優先搜尋 Depth-First Search
以 3x3 庭院示範:
4
2
4
3
1
2
3
4
5
6
7
8
9
Ruby@NTUIMCP
暑期訓練 > 淹水問題
深度優先搜尋 Depth-First Search
以 3x3 庭院示範:
4
2
4
3
1
2
3
4
5
6
7
8
9
Ruby@NTUIMCP
暑期訓練 > 淹水問題
深度優先搜尋 Depth-First Search
以 3x3 庭院示範:
4
2
4
3
1
2
3
4
5
6
7
8
9
Ruby@NTUIMCP
暑期訓練 > 淹水問題
深度優先搜尋 Depth-First Search
以 3x3 庭院示範:
4
2
4
3
1
2
3
4
5
6
7
8
9
Ruby@NTUIMCP
暑期訓練 > 淹水問題
深度優先搜尋 Depth-First Search
以 3x3 庭院示範:
4
2
4
3
1
2
3
4
5
6
7
8
9
Ruby@NTUIMCP
暑期訓練 > 淹水問題
深度優先搜尋 Depth-First Search
以 3x3 庭院示範:
4
2
4
3
1
2
3
4
5
6
7
8
9
Ruby@NTUIMCP
暑期訓練 > 淹水問題
深度優先搜尋 Depth-First Search
以 3x3 庭院示範:
2
4
3
1
2
3
4
5
6
7
8
9
Ruby@NTUIMCP
暑期訓練 > 淹水問題
深度優先搜尋 Depth-First Search
以 3x3 庭院示範:
4
3
1
2
3
4
5
6
7
8
9
Ruby@NTUIMCP
暑期訓練 > 淹水問題
深度優先搜尋 Depth-First Search
以 3x3 庭院示範:
4
1
2
3
4
5
6
7
8
9
Ruby@NTUIMCP
暑期訓練 > 淹水問題
深度優先搜尋 Depth-First Search
以 3x3 庭院示範:
1
2
3
4
5
6
7
8
9
Ruby@NTUIMCP
暑期訓練 > 淹水問題
深度優先搜尋 Depth-First Search
以 3x3 庭院示範:
1
2
3
4
5
6
7
8
9
Done!
Ruby@NTUIMCP
暑期訓練 > 淹水問題
暑期訓練 > 淹水問題
淹水問題 Flood Fill Problem
Depth-First Search (DFS)
深度優先搜尋
Breadth-First Search (BFS)
廣度優先搜尋
How to flood fill?
該如何淹水?
Ruby@NTUIMCP
暑期訓練 > 淹水問題
廣度優先搜尋,顧名思義:
以廣度為優先進行「淹水擴散」
Ruby@NTUIMCP
優先擴散最「舊」水源
廣度優先搜尋 Breadth-First Search
暑期訓練 > 淹水問題
廣度優先搜尋 Breadth-First Search
以 3x3 庭院示範:
2
3
4
1
1
Ruby@NTUIMCP
暑期訓練 > 淹水問題
廣度優先搜尋 Breadth-First Search
以 3x3 庭院示範:
2
3
4
1
Ruby@NTUIMCP
2
4
2
暑期訓練 > 淹水問題
廣度優先搜尋 Breadth-First Search
以 3x3 庭院示範:
3
4
1
Ruby@NTUIMCP
2
4
2
3
1
3
暑期訓練 > 淹水問題
廣度優先搜尋 Breadth-First Search
以 3x3 庭院示範:
4
1
Ruby@NTUIMCP
2
4
2
3
1
3
4
4
2
暑期訓練 > 淹水問題
廣度優先搜尋 Breadth-First Search
以 3x3 庭院示範:
1
Ruby@NTUIMCP
2
4
2
3
1
3
4
4
2
5
1
3
暑期訓練 > 淹水問題
廣度優先搜尋 Breadth-First Search
以 3x3 庭院示範:
1
Ruby@NTUIMCP
4
2
3
1
3
4
4
2
5
1
3
6
1
暑期訓練 > 淹水問題
廣度優先搜尋 Breadth-First Search
以 3x3 庭院示範:
1
Ruby@NTUIMCP
2
3
1
3
4
4
2
5
1
3
6
1
7
暑期訓練 > 淹水問題
廣度優先搜尋 Breadth-First Search
以 3x3 庭院示範:
1
Ruby@NTUIMCP
2
3
1
3
4
4
2
5
1
3
6
7
暑期訓練 > 淹水問題
廣度優先搜尋 Breadth-First Search
以 3x3 庭院示範:
1
Ruby@NTUIMCP
2
3
1
4
4
2
5
1
3
6
7
5
暑期訓練 > 淹水問題
廣度優先搜尋 Breadth-First Search
以 3x3 庭院示範:
1
Ruby@NTUIMCP
2
3
1
4
4
5
1
3
6
7
5
暑期訓練 > 淹水問題
廣度優先搜尋 Breadth-First Search
以 3x3 庭院示範:
1
Ruby@NTUIMCP
2
3
1
4
5
1
3
6
7
8
9
暑期訓練 > 淹水問題
廣度優先搜尋 Breadth-First Search
以 3x3 庭院示範:
1
Ruby@NTUIMCP
2
3
1
4
5
3
6
7
8
9
暑期訓練 > 淹水問題
廣度優先搜尋 Breadth-First Search
以 3x3 庭院示範:
1
Ruby@NTUIMCP
2
3
1
4
5
6
7
8
9
暑期訓練 > 淹水問題
廣度優先搜尋 Breadth-First Search
以 3x3 庭院示範:
1
Ruby@NTUIMCP
2
3
1
4
5
6
7
8
9
暑期訓練 > 淹水問題
暑期訓練 > 淹水問題
廣度優先搜尋 Breadth-First Search
以 3x3 庭院示範:
1
Ruby@NTUIMCP
2
3
1
4
5
6
7
8
9
暑期訓練 > 淹水問題
廣度優先搜尋 Breadth-First Search
以 3x3 庭院示範:
1
Ruby@NTUIMCP
2
3
1
4
5
6
7
8
9
暑期訓練 > 淹水問題
廣度優先搜尋 Breadth-First Search
以 3x3 庭院示範:
1
Ruby@NTUIMCP
2
3
1
4
5
6
7
8
9
暑期訓練 > 淹水問題
廣度優先搜尋 Breadth-First Search
以 3x3 庭院示範:
1
Ruby@NTUIMCP
2
3
1
4
5
6
7
8
9
Done!
暑期訓練 > 淹水問題
廣度優先搜尋 Breadth-First Search
以 3x3 庭院示範:
1
Ruby@NTUIMCP
2
3
1
4
5
6
7
8
9
Done!
暑期訓練 > 淹水問題
DFS / BFS 比較
Ruby@NTUIMCP
暑期訓練 > 淹水問題
Depth-First Search (DFS)
深度優先搜尋
Breadth-First Search (BFS)
廣度優先搜尋
How to flood fill?
該如何淹水?
優先擴散最「舊」水源
優先擴散最「新」水源
FILO -> Stack
FIFO -> Queue
淹水問題 Flood Fill Problem
Ruby@NTUIMCP
暑期訓練 > 淹水問題
DFS Implementation
Ruby@NTUIMCP
暑期訓練 > 淹水問題
def dfs(座標):
do_somethig(座標)
for 方向 in [上, 右, 下, 左]:
新座標 = 座標 往 方向 走一格
if not visited(新座標):
dfs(新座標)
BFS Implementation
Ruby@NTUIMCP
暑期訓練 > 淹水問題
def bfs(pos):
q = [pos]
while q 不為空:
curr = q[0]
q.pop(0)
do_somethig(curr)
for 方向 in [上, 右, 下, 左]:
新座標 = 座標 往 方向 走一格
if not visited(新座標):
q.append(新座標)
小試身手 Exercise
25 min
Ruby@NTUIMCP
暑期訓練 > 淹水問題
小試身手 Exercise
參考做法:
遍歷整個 grid ,每見到一格水,就把答案 +1 ,並且在該點做 dfs 把連續水方塊做標記,才不會重複計算水池數量。
Ruby@NTUIMCP
暑期訓練 > 淹水問題
淹水問題
Flood Fill Problem
Ruby@NTUIMCP
暑期訓練
暑期訓練
最短路徑
Shortest Path
淹水問題
Flood Fill Problem
Ruby@NTUIMCP
最短路徑
Shortest Path
暑期訓練
Ruby@NTUIMCP
Shortest Path Finding
暑期訓練 > 最短路徑
Breadth-First Search (BFS)
廣度優先搜尋
How to find shortest path?
怎麼找到最短路徑?
Dijkstra Shortest-Path
單源最短路徑
Ruby@NTUIMCP
Shortest Path Finding
暑期訓練 > 最短路徑
Ruby@NTUIMCP
Dijkstra Shortest-Path Algorithm
暑期訓練 > 最短路徑
Ruby@NTUIMCP
小試身手 Exercise
Ruby@NTUIMCP
暑期訓練 > 淹水問題
暑期訓練
最短路徑
Shortest Path
淹水問題
Flood Fill Problem
Ruby@NTUIMCP
謝謝大家
Brought to you by Ruby
Ruby@NTUIMCP