1020 飛地的數量

2022-09-21 00:54:09 字數 2957 閱讀 3399

給你乙個大小為 m x n 的二進位制矩陣 grid ,其中 0 表示乙個海洋單元格、1 表示乙個陸地單元格。

一次 移動 是指從乙個陸地單元格走到另乙個相鄰(上、下、左、右)的陸地單元格或跨過 grid 的邊界。

返回網格中 無法 在任意次數的移動中離開網格邊界的陸地單元格的數量。

示例 1:

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

輸出:3

解釋:有三個 1 被 0 包圍。乙個 1 沒有被包圍,因為它在邊界上。

示例 2:

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

輸出:0

解釋:所有 1 都在邊界上或可以到達邊界。

m == grid.length

n == grid[i].length

1 <= m, n <= 500

grid[i][j] 的值為 0 或 1

廣度優先搜尋

class

solution:

def numencl**es(self, grid: list[list[

int]]) -> int

:

if not grid: return

0l1, l2 = len(grid), len(grid[0

]) queue, records =list(), list()

for i in

range(l1):

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

])

if grid[i][l2 - 1

]:])

for j in

range(l2):

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

, j])

if grid[l1 - 1][j] == 1

:, j])

directions = [[0, 1], [0, -1], [1, 0], [-1, 0

]]

while

queue:

num = queue.pop(0

) x, y = num[0], num[1

]

if num not in

records:

else

:

continue

for direction in

directions:

_x, _y = x + direction[0], y + direction[1

] if0

<= _x < l1 and 0

<= _y

if (grid[_x][_y] == 1

):

if ([_x, _y] not in

records):

count = 0

# 取到所有為1的數量

for i in

range(l1):

for j in

range(l2):

if (grid[i][j] == 1 and [i, j] not in

records):

count += 1

return count

深度優先搜尋

class

solution:

def numencl**es(self, grid: list[list[

int]]) -> int

:

if not grid: return

0l1, l2 = len(grid), len(grid[0

]) visit = [[false] * l2 for _ in

range(l1)]

def dfs(x, y):

if x < 0 or x >= l1 or y < 0 or y >=l2 or not grid[x][y] or visit[x][y]:

return

visit[x][y] =true

directions = [[0,1],[0,-1], [1,0],[-1, 0

]]

for direction in

directions:

_x, _y = x + direction[0], y + direction[1

] if0

<= _x < l1 and 0

<= _y

ifgrid[_x][_y]:

dfs(_x, _y)

for i in

range(l1):

if grid[i][0

]: dfs(i, 0)

if grid[i][l2 - 1

]: dfs(i, l2 - 1

)

for j in

range(l2):

if grid[0

][j]:

dfs(

0, j)

if grid[l1 - 1

][j]:

dfs(l1 - 1

, j)

count = 0

for i in

range(l1):

for j in

range(l2):

ifgrid[i][j] and not visit[i][j]:

count += 1

return count

演算法題 飛地的數量

leetcode 1020 題目描述 給出乙個二維陣列a,每個單元格為 0 代表海 或 1 代表陸地 移動是指在陸地上從乙個地方走到另乙個地方 朝四個方向之一 或離開網格的邊界。返回網格中無法在任意次數的移動中離開網格邊界的陸地單元格的數量。示例 1 輸入 0,0,0,0 1,0,1,0 0,1,1...

查詢接待收待飛地數量失敗 中國有哪些飛地?

說兩處比較冷門的 上海市位於安徽宣城的兩塊飛地 白茅嶺農場和軍天湖農場。這兩處飛地起源於上世紀50年代。解放後上海市各類社會不安定分子還有很多,彼時,新中國剛成立,為了確保上海這座重要工業城市的平安 穩定和經濟發展,上海就想出了在異地既能改造人,又能改造自然的計畫,於是白茅嶺等農場應運而生。1956...

飛機加油飛地球一圈的問題

題目 假設有n架飛機,必須從同1飛機場起飛,不許中途降落,可空中互相加油,每個飛機油箱最多只能飛地球半圈,問至少需要多少飛機才能保證至少1架飛機繞地球1圈。此題關鍵一點 地球是圓的。可以往相反的方向飛,這一點也不違背題目中只能從同乙個機場起飛的前提。解題思路 1 3架飛機從起點o經右往左飛。此時油量...