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),單元格可以被覆蓋幾次?
- [Python手撕]兩個升序陣列的中位數Python陣列
- [Python手撕]LFUPython
- [Python手撕]LRUPython
- 2024_4_22 路徑花費為最長$k$條邊之和最短路
- [Python手撕]接雨水Python
- [Python手撕]有序陣列中的單一元素Python陣列
- 動手構建地鐵關係網,實現最短路徑查詢
- 比拼華為、小米,拍照最好的IPhone手機價格最貴!iPhone
- [Python手撕]完全平方數Python
- [Python手撕]爬樓梯Python
- [Python手撕]公交路線Python
- 次短路
- 樂視手機2評測 價格最便宜?
- [Python手撕]不同的二叉搜尋樹Python
- 幾個最短路徑的演算法演算法
- 獲取所有鑰匙的最短路徑
- 最短路徑問題
- 蘋果手機會中勒索病毒嗎 安卓手機會中勒索病毒嗎?蘋果安卓
- [Python手撕]最大子陣列和Python陣列
- Python小白的數學建模課-16.最短路徑演算法Python演算法
- 陣列手撕堆,你學會了嗎?陣列
- 摺紙風格的微型機器人可以開啟外科手術機器人的新時代機器人
- 圖的最短路徑演算法彙總演算法
- 尋找兩條最短路的公共路徑
- Python數模筆記-NetworkX(2)最短路徑Python筆記
- 「Python實用祕技05」在Python中妙用短路機制Python
- 手撕OkHttpHTTP
- [SQL手撕]SQL
- 矩陣求最短路徑矩陣
- 最短路徑演算法演算法
- QOJ #8673. 最短路徑
- [Python手撕]判斷二分圖Python
- [Python手撕]滑動視窗最大值Python
- [Python手撕]搜尋二維矩陣Python矩陣
- Python可以開發網頁嗎?有什麼好用的框架?Python網頁框架
- DS圖—圖的最短路徑(不含程式碼框架)框架