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)
相关推荐
青少儿编程课堂10 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:字典树前缀树与单词检索统计
c++·python·算法·bfs·信息学竞赛
青少儿编程课堂11 小时前
2026蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:堆排序与优先队列解析
c++·python·算法·bfs·信息学竞赛
青少儿编程课堂2 天前
蓝桥杯青少组 + 全国青少年信息素养大赛 + 电子学会图形化考级|校园推箱子大挑战解析
c++·python·算法·bfs·信息学竞赛
青少儿编程课堂3 天前
蓝桥杯青少组·全国青少年信息素养·电子学会Scratch考级:校园智能抢答器项目解析
c++·python·算法·bfs·信息学竞赛
Tisfy4 天前
LeetCode 3619.总价值可以被 K 整除的岛屿数目:广度优先搜索BFS
算法·leetcode·bfs·宽度优先
青少儿编程课堂5 天前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:位运算实战——二进制权限与最大异或解析
c++·python·算法·bfs·信息学竞赛
青少儿编程课堂5 天前
2026蓝桥杯青少组图形化真题:校园飞机大战解析(全国青少年信息素养·电子学会图形化考级)
c++·python·算法·bfs·信息学竞赛
青少儿编程课堂10 天前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:差分数组与区间修改实战解析
c++·python·算法·bfs·信息学竞赛
青少儿编程课堂11 天前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C/C++考级:任意进制互转与大数多进制加法解析
c++·python·算法·bfs·信息学竞赛
青少儿编程课堂12 天前
蓝桥杯·全国青少年信息素养大赛·电子学会C/C++考级:拓扑排序课程表排课解析
c++·python·算法·bfs·信息学竞赛