題目描述: 給定一個 m × n 的網格,每個格子有一個方向(1=右, 2=左, 3=下, 4=上)。你可以花費 1 的代價改變任意格子的方向。找出從左上角 (0,0) 到右下角 (m-1,n-1) 的最小代價路徑。
解題思路: 這是一個 0-1 BFS 問題。沿著格子本身指示的方向移動代價為 0,改變方向移動代價為 1。使用雙端佇列(deque)實現 0-1 BFS:代價為 0 的鄰居放到佇列前端,代價為 1 的放到後端。這樣可以保證佇列中的元素按代價排序,等效於 Dijkstra 但更高效。
時間複雜度:O(m × n) — 每個格子最多被處理一次,0-1 BFS 的標準複雜度
空間複雜度:O(m × n) — 距離矩陣和雙端佇列
1. Initialize dist[m][n] with infinity, dist[0][0] = 0
2. Push (0, 0) to front of deque
3. While deque is not empty:
a. Pop front cell (x, y)
b. For each of 4 directions d:
- Calculate neighbor (nx, ny)
- cost = 0 if grid[x][y] matches direction d+1, else 1
- If dist[x][y] + cost < dist[nx][ny]:
- Update dist[nx][ny]
- Push to front if cost = 0, back if cost = 1
4. Return dist[m-1][n-1]方法二:Dijkstra + 優先佇列 將每個格子視為圖的節點,邊權為 0(順方向)或 1(改方向),用 Dijkstra 求最短路。時間複雜度 O(mn log(mn)),比 0-1 BFS 多一個 log 因子。
方法三:動態規劃 + 多次鬆弛 類似 Bellman-Ford 的思路,反覆從四個方向鬆弛直到不再更新。正確性有保證但效率較低。