1254 統計封閉島嶼的數目(dfs)

2021-10-07 16:48:54 字數 2132 閱讀 2105

1. 問題描述:

有乙個二維矩陣 grid ,每個位置要麼是陸地(記號為 0 )要麼是水域(記號為 1 )。我們從一塊陸地出發,每次可以往上下左右 4 個方向相鄰區域走,能走到的所有陸地區域,我們將其稱為一座「島嶼」。如果一座島嶼 完全 由水域包圍,即陸地邊緣上下左右所有相鄰區域都是水域,那麼我們將其稱為 「封閉島嶼」。請返回封閉島嶼的數目。

示例 1:

輸入:grid = [[1,1,1,1,1,1,1,0],[1,0,0,0,0,1,1,0],[1,0,1,0,1,1,1,0],[1,0,0,0,0,1,0,1],[1,1,1,1,1,1,1,0]]

輸出:2

解釋:灰色區域的島嶼是封閉島嶼,因為這座島嶼完全被水域包圍(即被 1 區域包圍)。

示例 2:

輸入:grid = [[0,0,1,0,0],[0,1,0,1,0],[0,1,1,1,0]]

輸出:1

示例 3:

輸入:grid = [[1,1,1,1,1,1,1],

[1,0,0,0,0,0,1],

[1,0,1,1,1,0,1],

[1,0,1,0,1,0,1],

[1,0,1,1,1,0,1],

[1,0,0,0,0,0,1],

[1,1,1,1,1,1,1]]

輸出:2

2. 思路分析:

3. **如下:

class solution:

def closedisland(self, grid: list[list[int]]) -> int:

# 左右上下四個方向

pos = [[0, 1], [0, -1], [1, 0], [-1, 0]]

# 下面這個dfs方法是用來填充邊緣的陸地為水

def dfs(grid, current_r, current_c, r, c):

for i in range(4):

x, y = current_r + pos[i][0], current_c + pos[i][1]

if 0 <= x < r and 0 <= y < c and grid[x][y] == 0:

grid[x][y] = 1

dfs(grid, x, y, r, c)

# 這道題目與之前不同的是這裡要求的是完全封閉的也就是陸地的四周都是水

# 乙個簡單的想法是將靠近邊緣的陸地都置為水

r, c = len(grid), len(grid[0])

for i in range(len(grid[0])):

# 第一行與最後一行

if grid[0][i] == 0:

grid[0][i] = 1

dfs(grid, 0, i, r, c)

if grid[r - 1][i] == 0:

grid[r - 1][i] = 1

dfs(grid, r - 1, i, r, c)

for i in range(len(grid)):

# 第一列與最後一列

if grid[i][0] == 0:

grid[i][0] = 1

dfs(grid, i, 0, r, c)

if grid[i][c - 1] == 0:

grid[i][c - 1] = 1

dfs(grid, i, c - 1, r, c)

res = 0

for i in range(r):

for j in range(c):

if grid[i][j] == 0:

dfs(grid, i, j, r, c)

res += 1

return res

1254 統計封閉島嶼的數目

深度優先搜尋 dfs 的題。因為邊界的陸地不算島嶼,所以搜尋的時候把邊界的陸地及與邊界相連的陸地去掉。然後對陣列進行遍歷,求出島嶼數即可。方案一 public int closedisland int grid for int j 0 j grid 0 length j 尋找島嶼數量 int isl...

統計封閉島嶼的數目

有乙個二維矩陣 grid 每個位置要麼是陸地 記號為 0 要麼是水域 記號為 1 我們從一塊陸地出發,每次可以往上下左右 4 個方向相鄰區域走,能走到的所有陸地區域,我們將其稱為一座 島嶼 如果一座島嶼 完全 由水域包圍,即陸地邊緣上下左右所有相鄰區域都是水域,那麼我們將其稱為 封閉島嶼 請返回封閉...

leetcode 統計封閉島嶼的數目

有乙個二維矩陣 gri dgrid grid 每個位置要麼是陸地 記號為 0 要麼是水域 記號為 1 我們從一塊陸地出發,每次可以往上下左右 4 個方向相鄰區域走,能走到的所有陸地區域,我們將其稱為一座 島嶼 如果一座島嶼 完全 由水域包圍,即陸地邊緣上下左右所有相鄰區域都是水域,那麼我們將其稱為 ...