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)
相关推荐
froyoisle8 天前
CSP 真题解析:[CSP-J 2019-T4] 加工零件
c++·算法·bfs·csp-j·算法竞赛·信息学·信奥赛
汉克老师15 天前
GESP2026年6月认证C++七级( 第一部分选择题(8-15))精讲
c++·dfs·bfs·哈希·二分算法·gesp7级·网格dp
拳里剑气16 天前
C++算法:队列与BFS
c++·算法·bfs·宽度优先·队列
硕风和炜16 天前
【LeetCode: 2492. 两个城市间路径的最小分数 + DFS】
java·算法·leetcode·深度优先·dfs·bfs·并查集
小欣加油1 个月前
leetcode994 腐烂的橘子
数据结构·c++·算法·leetcode·bfs
小欣加油1 个月前
leetcode542 01矩阵
数据结构·c++·算法·leetcode·矩阵·bfs
进击的荆棘2 个月前
优选算法——队列+宽搜
数据结构·c++·算法·leetcode·bfs·队列
Misnearch2 个月前
1345. 跳跃游戏 IV
java·leetcode·bfs
YL200404262 个月前
041二叉树的层序遍历
数据结构·leetcode·bfs
浅念-2 个月前
LeetCode最短路必看:BFS算法原理+经典题解
数据结构·c++·算法·leetcode·职场和发展·bfs·宽度优先