Python程式移除完全被水包圍的島嶼
假設我們有一個二進位制矩陣,其中 1 表示陸地,0 表示水。一個島嶼是由 1 組成的,並且被 0(水)或邊緣包圍。我們需要找到所有完全被水包圍的島嶼,並將它們修改為 0。我們知道,如果一個島嶼的所有鄰居(水平和垂直,而非對角線)都是 0(沒有鄰居是邊緣),則該島嶼被完全包圍。
因此,如果輸入如下所示:
1 | 0 | 0 | 0 |
0 | 1 | 1 | 0 |
0 | 1 | 1 | 0 |
0 | 1 | 1 | 0 |
0 | 0 | 0 | 1 |
則輸出將是
1 | 0 | 0 | 0 |
0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 |
0 | 0 | 0 | 1 |
為了解決這個問題,我們將遵循以下步驟:
row := A 的行數
col := A 的列數
B := 一個與 A 大小相同且填充為 0 的矩陣
seen := 一個新的集合
對於範圍從 0 到 row 的 i,執行:
對於範圍從 0 到 col 的 j,執行:
如果 i 和 j 超出矩陣範圍,則
進行下一次迭代
如果 (i, j) 已經被訪問過,則
進行下一次迭代
如果 A[i, j] 等於 0,則
進行下一次迭代
d := 一個雙端佇列,包含一個元素 (i, j)
當 d 不為空時,執行:
(x, y) := d 的左側元素,並從 d 中刪除
B[x, y] := 1
對於 (x, y) 的每個鄰居 (x2, y2),執行:
如果 (x2, y2) 沒有被訪問過,則
將 (x2, y2) 插入到 d 的末尾
標記 (x2, y2) 為已訪問
返回 B
示例
讓我們看看以下實現,以便更好地理解:
from collections import deque class Solution: def solve(self, A): row = len(A) col = len(A[0]) B = [[0 for _ in range(col)] for _ in range(row)] seen = set() def nei(i, j): if i + 1 < row and A[i + 1][j]: yield (i + 1, j) if j + 1 < col and A[i][j + 1]: yield (i, j + 1) if i - 1 >= 0 and A[i - 1][j]: yield (i - 1, j) if j - 1 >= 0 and A[i][j - 1]: yield (i, j - 1) for i in range(row): for j in range(col): if i not in (0, row - 1) and j not in (0, col - 1): continue if (i, j) in seen: continue if A[i][j] == 0: continue d = deque([(i, j)]) while d: x, y = d.popleft() B[x][y] = 1 for x2, y2 in nei(x, y): if (x2, y2) not in seen: d.append((x2, y2)) seen.add((x2, y2)) return B ob = Solution() matrix = [ [1, 0, 0, 0], [0, 1, 1, 0], [0, 1, 1, 0], [0, 1, 1, 0], [0, 0, 0, 1], ] print(ob.solve(matrix))
輸入
[ [1, 0, 0, 0], [0, 1, 1, 0], [0, 1, 1, 0], [0, 1, 1, 0], [0, 0, 0, 1], ]
輸出
[ [1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 1] ]
廣告