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)
相关推荐
无影无踪的青蛙17 天前
[C++]洛谷B3626 跳跃机器人(题干 + 详细讲解, BFS练习题)
开发语言·c++·算法·bfs·广度优先
GGBondlctrl1 个月前
【leetcode】《BFS扫荡术:如何用广度优搜索征服岛屿问题》
算法·leetcode·bfs·宽度优先·图像渲染·岛屿的数量·被围绕的区域
理想奋斗中1 个月前
【LeetCode Hot100 | 每日刷题】二叉树的层序遍历
算法·leetcode·bfs
Dante7981 个月前
【多源01BFS】Codeforce:Three States
c++·算法·bfs
qystca2 个月前
蓝桥云客 岛屿个数
算法·dfs·bfs
Repeat7152 个月前
混境之地1
算法·蓝桥杯·bfs·dijkstra·三月末这么热正常吗?·摆烂的一天...回去睡觉!
乌云暮年3 个月前
算法刷题整理合集(四)
java·开发语言·算法·dfs·bfs
慕羽★3 个月前
C++中的单例模式及具体应用示例
c++·单例模式·机器人·多线程·bfs·规划
硕风和炜4 个月前
【LeetCode: 958. 二叉树的完全性检验 + bfs + 二叉树】
java·算法·leetcode·二叉树·bfs·宽度优先·完全二叉树