class Solution:
def shortestPath(self, grid: List[List[int]], k: int) -> int:
n = len(grid)
m = len(grid[0])
if m == n == 1:
return 0
direction = [[0, 1], [-1, 0], [1, 0], [0, -1]]
visited = [[[False] * (k + 1) for _ in range(m)] for _ in range(n)]
visited[0][0][k] = True
queue = deque([(0, 0, k, 0)])
while queue:
x, y, f, s = queue.popleft()
for d in direction:
next_x = x + d[0]
next_y = y + d[1]
if next_x == n - 1 and next_y == m - 1:
return s + 1
else:
# 判斷下一個位置是否超出範圍
if 0 <= next_x < n and 0 <= next_y < m:
# 如果下一個位置是牆,必須保證還有破牆術,
# 並且我們必須保證之前沒有路徑訪問過這個位置的時候剩餘的破牆數等於當前路徑剩餘的破牆術,
# 更不能容忍之前路徑剩餘的破牆術大於當前路徑剩餘的破牆術,
# 上面兩種情況下,當前路徑是不可能比之前路徑更快的
if (
grid[next_x][next_y] == 1
and f >= 1
and sum(visited[next_x][next_y][f - 1 : k + 1]) == 0
):
visited[next_x][next_y][f - 1] = 1
queue.append([next_x, next_y, f - 1, s + 1])
elif (
grid[next_x][next_y] == 0
and sum(visited[next_x][next_y][f : k + 1]) == 0
):
visited[next_x][next_y][f] = 1
queue.append([next_x, next_y, f, s + 1])
return -1
[Python手撕]網格中的最短路徑(可以有k次破牆的機會)
相關文章
- [Python手撕]二叉樹中的最大路徑和Python二叉樹
- 最短路 || 最長路 || 次短路
- 用k*k的方格覆蓋單元格(i,j),單元格可以被覆蓋幾次?
- 單源最短路徑:最短路徑性質的證明
- 2024_4_22 路徑花費為最長$k$條邊之和最短路
- [Python手撕]兩個升序陣列的中位數Python陣列
- 迷宮的最短路徑
- [Python手撕]LFUPython
- [Python手撕]LRUPython
- 北京哪裡有開手撕發票 # 哪裡可以開 #
- 上海哪裡有開手撕發票 # 哪裡可以開 #
- 深圳哪裡有開手撕發票 # 哪裡可以開 #
- 成都哪裡有開手撕發票 # 哪裡可以開 #
- 杭州哪裡有開手撕發票 # 哪裡可以開 #
- 西安哪裡有開手撕發票 # 哪裡可以開 #
- 天津哪裡有開手撕發票 # 哪裡可以開 #
- 南京哪裡有開手撕發票 # 哪裡可以開 #
- 成都哪裡有開手撕發票“哪裡可以開”
- 圖的最短路徑(Dijkstra | Floyd)
- [Python手撕]接雨水Python
- [Python手撕]有序陣列中的單一元素Python陣列
- 廣州哪裡有開手撕發票 # 哪裡可以開 #
- 重慶哪裡有開手撕發票 # 哪裡可以開 #
- 武漢哪裡有開手撕發票 # 哪裡可以開 #
- 長沙哪裡有開手撕發票 # 哪裡可以開 #
- 鄭州哪裡有開手撕發票 # 哪裡可以開 #
- 東莞哪裡有開手撕發票 # 哪裡可以開 #
- 青島哪裡有開手撕發票 # 哪裡可以開 #
- 瀋陽哪裡有開手撕發票 # 哪裡可以開 #
- 長春哪裡有開手撕發票"哪裡可以開"
- 廣州哪裡有開手撕發票“哪裡可以開”
- 廣州哪裡可以開手撕發票“哪裡有開”
- 動手構建地鐵關係網,實現最短路徑查詢
- [Python手撕]公交路線Python
- [Python手撕]完全平方數Python
- [Python手撕]爬樓梯Python
- 6.4.2最短路徑
- 圖 - 最短路徑