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 天前
算法奇妙屋(十)-队列+宽搜(BFS)
java·数据结构·算法·bfs·宽度优先·队列
麦烤楽鸡翅6 天前
挡住洪水 (牛客)
java·数据结构·c++·python·算法·bfs·牛客
徐子童6 天前
FloodFill---BFS
算法·bfs·宽度优先·队列·floodfill
让我们一起加油好吗25 天前
【基础算法】01BFS
数据结构·c++·算法·bfs·01bfs
_OP_CHEN25 天前
C++基础:(十五)queue的深度解析和模拟实现
开发语言·c++·stl·bfs·queue·容器适配器·queue模拟实现
让我们一起加油好吗1 个月前
【基础算法】多源 BFS
c++·算法·bfs·宽度优先·多源bfs
是阿建吖!3 个月前
【递归、搜索与回溯算法】穷举、暴搜、深搜、回溯、剪枝
算法·bfs·剪枝
CUC-MenG3 个月前
2025牛客多校第五场 K.完美旅程 J.最快覆盖问题 E.神秘异或操作 个人题解
数学·dfs·bfs·优先队列·二分·位运算·fmt·曼哈顿距离·fwt
Espresso Macchiato3 个月前
Leetcode 3629. Minimum Jumps to Reach End via Prime Teleportation
bfs·广度优先遍历·leetcode medium·leetcode 3629·leetcode周赛460·质数求解·质因素分解
柏箱5 个月前
容器里有10升油,现在只有两个分别能装3升和7升油的瓶子,需要将10 升油等分成2 个5 升油。程序输出分油次数最少的详细操作过程。
算法·bfs