Ma trận heights m x n. Từ (0,0) đến (m-1,n-1), di chuyển 4 hướng. Nỗ lực đường đi = max |chênh lệch cao độ| giữa 2 ô liên tiếp. Tìm nỗ lực tối thiểu.
Ví dụ: [[2,3,4],[4,9,5],[6,4,6]] → 1. Đường: 2→3→4→5→6 (chênh lệch max = 1).
Giải thuật (Dijkstra / Priority Queue)
- Priority queue lưu
(effort, x, y), ưu tiên effort nhỏ. - Pop trạng thái effort nhỏ nhất. Nếu đến đích → trả về effort.
- Nếu ô đã thăm (đánh dấu bằng chuỗi rỗng) → bỏ qua.
- Mở rộng 4 hướng: tính
eff = max(curr_eff, abs(heights[nx][ny] - heights[x][y])), push vào queue. - Đánh dấu ô hiện tại đã thăm.
Ví dụ minh họa
import heapq
def solve(heights):
r, c = len(heights), len(heights[0])
queue = [(0, 0, 0)]
while queue:
c_eff, x, y = heapq.heappop(queue)
if x == r - 1 and y == c - 1:
return c_eff
if heights[x][y] == "":
continue
for dx, dy in [[1,0],[-1,0],[0,1],[0,-1]]:
nx, ny = x + dx, y + dy
if 0 <= nx < r and 0 <= ny < c and heights[nx][ny] != "":
eff = max(c_eff, abs(heights[nx][ny] - heights[x][y]))
heapq.heappush(queue, (eff, nx, ny))
heights[x][y] = ""
return -1
matrix = [[2,3,4],[4,9,5],[6,4,6]]
print(solve(matrix))
Đầu vào
[[2,3,4],[4,9,5],[6,4,6]]
Đầu ra
1