題目分析(分析轉自sweetiee):
這是一道典型的BFS基礎應用,爲什麼這麼說呢?
因爲我們只要先把所有的陸地都入隊,然後從各個陸地同時開始一層一層的向海洋擴散,那麼最後擴散到的海洋就是最遠的海洋!
並且這個海洋肯定是被離他最近的陸地給擴散到的!
下面是擴散的圖示,1表示陸地,0表示海洋。每次擴散的時候會標記相鄰的4個位置的海洋:
你可以想象成你從每個陸地上派了很多支船去踏上偉大航道,踏遍所有的海洋。每當船到了新的海洋,就會分裂成4條新的船,向新的未知海洋前進(訪問過的海洋就不去了)。如果船到達了某個未訪問過的海洋,那他們是第一個到這片海洋的。很明顯,這麼多船最後訪問到的海洋,肯定是離陸地最遠的海洋。
def maxDistance(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
# 使用數組模擬隊列
data = []
raw = len(grid)
col = len(grid[0])
for r in range(raw):
for c in range(col):
if grid[r][c] == 1:
data.append([r,c])
d = [(0,-1),(0,1),(1,0),(-1,0)]
res = -1
# 保持隊列有序pop
while data:
x,y = data.pop(0)
# 將其四周的海洋入隊
for i,j in d:
c_x,c_y = x+i,y+j
# 1)判斷邊界;2)判斷該點是否已遍歷
if c_x >= 0 and c_x < raw and c_y >= 0 and c_y < col and grid[c_x][c_y] == 0:
# 標記海洋爲已訪問
grid[c_x][c_y] = grid[x][y]+1
¥ 將海洋加入到隊列
data.append([c_x,c_y])
res=grid[x][y]
return res