代码随想录算法训练营第51天|99. 岛屿数量、100. 岛屿的最大面积

1. 99. 岛屿数量(深度优先遍历)

题目链接:99. 岛屿数量
文档讲解: 代码随想录

本题思路,是用遇到的一个没有遍历过的节点陆地,计数器加一,然后把该节点陆地所能遍历到的陆地都标记上。在遇到标记过陆地节点和海洋节点都直接跳过,这样计数器就是最终岛屿的数量。

direction = [[0,1],[0,-1],[-1,0],[1,0]] #四个方向:上下左右

def dfs(grid,visited,x,y):
    #对一块陆地进行深度优先遍历并标记
    for i,j in direction:
        next_x = x + i #上下
        next_y = y + j #左右
        #下标越界,跳过不进入递归
        if next_x < 0 or next_y < 0 or next_x >= len(grid) or next_y >= len(grid[0]):
            continue
        #未访问过的陆地,标记并调用深度优先遍历
        if not visited[next_x][next_y] and grid[next_x][next_y] == 1:
            visited[next_x][next_y] = True 
            dfs(grid,visited,next_x,next_y)

n,m = map(int,input().split())
grid = []
for _ in range(n):
    grid.append(list(map(int,input().split())))
count = 0
#访问表
visited = [[False] * m for _ in range(n)]
for i in range(n):
    for j in range(m):
        #判断
        if grid[i][j] == 1 and not visited[i][j]:
            count += 1 
            visited[i][j] = True 
            dfs(grid,visited,i,j)
print(count)
direction = [[0,1],[0,-1],[1,0],[-1,0]]
def dfs(grid,visited,x,y):
    #终止条件
    if visited[x][y] or grid[x][y] == 0:
        #访问过或者遇到海洋
        return 
    visited[x][y] = True
    for i,j in direction:
        next_x = x + i 
        next_y = y + j 
        if next_x < 0 or next_x >= len(grid) or next_y < 0 or next_y >= len(grid[0]):
            continue 
        dfs(grid,visited,next_x,next_y)
n,m = map(int,input().split())
grid = []
for _ in range(n):
    grid.append(list(map(int,input().split())))
res = 0
visited = [[False] * m for _ in range(n)]
for i in range(n):
    for j in range(m):
        if not visited[i][j] and grid[i][j] == 1:
            res += 1 
            dfs(grid,visited,i,j)
print(res)

2. 99. 岛屿数量(广度优先遍历)

题目链接:99. 岛屿数量
文档讲解: 代码随想录

只要节点加入队列就代表走过,就需要标记,而不是从队列拿出来的时候再标记走过。

from collections import deque
direction = [[0,1],[0,-1],[1,0],[-1,0]]
def bfs(grid,visited,x,y):
    queue = deque()
    queue.append((x,y))
    #只要入队列就标记访问过
    visited[x][y] = True
    while queue:
        #队列不为空
        cur = queue.popleft()
        cur_x = cur[0]
        cur_y = cur[1]
        for i,j in direction:
            next_x = cur_x + i 
            next_y = cur_y + j 
            if next_x < 0 or next_x >= len(grid) or next_y < 0 or next_y >= len(grid[0]):
                continue 
            if not visited[next_x][next_y] and grid[next_x][next_y] == 1:
                queue.append((next_x,next_y))
                visited[next_x][next_y] = True
n,m = map(int,input().split())
grid = []
for _ in range(n):
    grid.append(list(map(int,input().split())))
res = 0
visited = [[False] * m for _ in range(n)]
for i in range(n):
    for j in range(m):
        if not visited[i][j] and grid[i][j] == 1:
            res += 1 
            bfs(grid,visited,i,j)
print(res)

3. 100. 岛屿的最大面积

题目链接:100. 岛屿的最大面积
文档讲解: 代码随想录

这道题在上一题的基础上需要统计岛屿的面积。

#深度优先遍历
direction = [[0,1],[0,-1],[1,0],[-1,0]]
count = 0
def dfs(grid,visited,x,y,res):
    #定义全局变量
    global count
    
    for i,j in direction:
        next_x = x + i 
        next_y = y + j 
        if next_x < 0 or next_x >= len(grid) or next_y < 0 or next_y >= len(grid[0]):
            continue
        if not visited[next_x][next_y] and grid[next_x][next_y] == 1:
            visited[next_x][next_y] = True
            count += 1 
            dfs(grid,visited,next_x,next_y,res)

n,m = map(int,input().split())
grid = []
for _ in range(n):
    grid.append(list(map(int,input().split())))
visited = [[False] * m for _ in range(n)]
max_res = 0
for i in range(n):
    for j in range(m):
        if not visited[i][j] and grid[i][j] == 1:
            count = 1
            visited[i][j] = True
            dfs(grid,visited,i,j,0)
            max_res = max(max_res,count)
print(max_res)

在 Python 中,global 关键字用于在函数内部声明一个变量是全局变量,而不是函数内部的局部变量。使用 global 可以使得函数内部对变量的修改反映到函数外部的全局范围。

#广度优先遍历
from collections import deque
direction = [[0,1],[0,-1],[1,0],[-1,0]]
count = 0
def bfs(grid,visited,x,y):
    global count 
    que = deque()
    que.append([x,y])
    visited[x][y] = True
    while que:
        cur = que.popleft()
        for i,j in direction:
            next_x = cur[0] + i 
            next_y = cur[1] + j 
            if next_x < 0 or next_x >= len(grid) or next_y < 0 or next_y >= len(grid[0]):
                continue
            if not visited[next_x][next_y] and grid[next_x][next_y] == 1:
                count += 1 
                que.append([next_x,next_y])
                visited[next_x][next_y] = True 
n,m = map(int,input().split())
grid = []
for _ in range(n):
    grid.append(list(map(int,input().split())))
visited = [[False] * m for _ in range(n)]
res = 0
for i in range(n):
    for j in range(m):
        if not visited[i][j] and grid[i][j] == 1:
            count = 1
            bfs(grid,visited,i,j)
            res = max(res,count)
print(res)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值