#岛屿数量
from typing import List
def numIsLand(grid:List[List[str]])->int:
cnt=0
rows=len(grid)
cols=len(grid[0])
visited=[[False]*cols for _ in range(rows)]
direction=[0,1,0,-1,1,0,-1,0]
def dfs(i,j): #用于从该点进行扩散
if i<0 or i>=rows or j<0 or j>=cols or grid[i][j]!='1' or visited[i][j]==True: #不符合条件不扩散
return
visited[i][j]=True #标记该点为已访问
for k in range(0,8,2): #访问它的上下左右
next_x=i+direction[k]
next_y=j+direction[k+1]
dfs(next_x,next_y) #递归扩散
for i in range(rows):
for j in range(cols):
if grid[i][j]=='1' and visited[i][j]==False: #找到岛屿入口
cnt+=1 #岛屿数量加一
dfs(i,j) #递归找与该点相邻的陆地
return cnt
def main():
grid = grid = [
['1','1','0','0','0'],
['1','1','0','0','0'],
['0','0','1','0','0'],
['0','0','0','1','1']
]
res=numIsLand(grid)
print(res)
if __name__=="__main__":
main()
思路:可用DFS求解
1.找到岛屿入口:遍历每一个点,仅当当前点为1(即陆地),且未访问过时,说明找到了一块陆地,陆地数量加一,然后以此点进行扩散(上下左右扩散,斜对角元素不扩散),使用DFS递归进行扩散,将与该点相连的所有陆地全部标记为已访问。
2.扩散到某一点时,先判断,如果越界或者已访问或者不是陆地,则直接返回。
3.如果没有越界,没有访问,且为陆地,则将该点标记为已访问,然后再去递归访问它的相邻点(上下左右),