代码随想录算法训练营第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)
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码随想录算法训练营是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练营中,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练营还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练营中的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第14训练营中,讲解了二叉树的理论基础、递归遍历、迭代遍历和统一遍历的内容。此外,在讨论中还分享了相关的博客文章和配图,帮助学员更好地理解和掌握二叉树的遍历方法。 训练营还提供了每日的讨论知识点,例如在第15的讨论中,介绍了层序遍历的方法和使用队列来模拟一层一层遍历的效果。在第16的讨论中,重点讨论了如何进行调试(debug)的方法,认为掌握调试技巧可以帮助学员更好地解决问题和写出正确的算法代码。 总之,代码随想录算法训练营是一个提供优质学习和讨论环境的平台,可以帮助学员系统地学习算法知识,并提供了丰富的讨论内容和刷题建议来提高算法编程能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [代码随想录算法训练营每日精华](https://blog.csdn.net/weixin_38556197/article/details/128462133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值