OD 算法题 B卷【最大岛屿体积】

文章目录

最大岛屿体积

  • 大于0的数表示陆地,0表示水,请计算由陆地、水组成的网格中最大岛屿的体积;
  • 陆地的数字之和表示所在岛屿的体积,岛屿总是被水包围,并且每座岛屿只能由水平或者垂直方向上相邻的陆地连接形成;
  • 假设该网格的四条边均被水包围;

输入描述:

第一行输入网格的宽度、高度;

后面几行输入网格数据;

输出描述:

输出岛屿的最大体积

示例

输入:

5 5

0 1 1 0 0

0 1 1 0 0

0 0 0 0 0

0 0 1 2 3

0 0 1 3 9

输出:

19

python实现:

  • BFS,借助队列;
  • 遍历二维数组中的每个值,当其大于0且未被访问时,开始广度优先搜索,并计算当前岛屿的体积,与默认的最大值比较,取两者中的最大值;
  • 注意避免位置的重复入队,会导致某些陆地值的重复计算;
python 复制代码
col, row = list(map(int, input().strip().split()))
matrix = []
for i in range(row):
    matrix.append(list(map(int, input().strip().split())))

# 记录岛屿的最大体积
max_vol = 0
# 标记是否已访问
visited = [[0 for j in range(col)] for i in range(row)]

# 遍历二维数组中的每个元素,大于0时则开始广度优先搜索陆地
for i in range(row):
    for j in range(col):
        if matrix[i][j] > 0 and visited[i][j] == 0: # 陆地的起始点,并开始广度优先搜索

            # BFS 借助队列
            q = [(i, j)]  # 存入起始点
            # 四个方向
            directions = [0, 1, 0, -1, 0]
            temp_vol = 0  # 统计当前岛屿的体积
            while q:
                cur_x, cur_y = q.pop(0)
                print("cur x, y", cur_x, cur_y)
                temp_vol += matrix[cur_x][cur_y]
                visited[cur_x][cur_y] = 1
                # 取四个方向的位置
                for d in range(4):
                    next_x = cur_x + directions[d]
                    next_y = cur_y + directions[d+1]
                    if next_x >= 0 and next_x < row and next_y >= 0 and next_y < col and visited[next_x][next_y] == 0 and matrix[next_x][next_y] > 0:
                        if (next_x, next_y) not in q:  # 注意去重
                            q.append((next_x, next_y))

            # 取岛屿体积的最大值
            print(temp_vol)
            max_vol = max(max_vol, temp_vol)


print(max_vol)
相关推荐
汉克老师3 天前
GESP2025年12月认证C++七级真题与解析(单选题8-15)
c++·dfs·bfs·二分·强联通分量·gesp7级·gesp七级
点云SLAM7 天前
BOOS库中Graph模块boost::edge_reverse_t和boost::vertex_color_t解读
数据库·edge·图论·bfs·dfs/拓扑排序·boost库、
不能只会打代码8 天前
力扣--1970. 你能穿过矩阵的最后一天(Java)
java·算法·leetcode·二分查找·力扣·bfs·最后可行时间
星火开发设计11 天前
广度优先搜索(BFS)详解及C++实现
数据结构·c++·算法··bfs·宽度优先·知识
xu_yule18 天前
算法基础-图论基础
数据结构·c++·算法·图论·dfs·bfs·最小生成树
EXtreme3518 天前
【数据结构】二叉树进阶:层序遍历不仅是按层打印,更是形态判定的利器!
c语言·数据结构·二叉树·bfs·广度优先搜索·算法思维·面试必考
_dindong20 天前
算法杂谈:回溯路线
数据结构·算法·动态规划·bfs·宽度优先
_OP_CHEN23 天前
【算法基础篇】(三十四)图论基础深度解析:从概念到代码,玩转图的存储与遍历
算法·蓝桥杯·图论·dfs·bfs·算法竞赛·acm/icpc
长安er1 个月前
LeetCode 102/103/513 二叉树层序遍历(BFS)三类经典题解题总结
数据结构·算法·leetcode·二叉树·bfs·层序遍历
长安er1 个月前
LeetCode 100/101/110/199 对称/平衡二叉树与右视图
算法·leetcode·二叉树·dfs·bfs·递归