You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

遍历布尔型二维数组,仅保留最大连续1的二维连通块

处理二维网格,保留最大连通▓▓区域的解决方案

这问题我之前做过类似的,给你梳理下清晰的解决思路和可落地的实现步骤:

核心思路概述

我们需要先识别出网格中所有的连通▓▓区域,统计每个区域的大小,然后只保留最大的那个区域,其余所有▓▓都转为░░。


具体步骤拆解

1. 给每个连通区域打唯一标记

遍历整个网格,每当遇到一个未被标记的▓▓(原始值为1),就用**BFS(广度优先搜索)或者DFS(深度优先搜索)**遍历它的所有连通单元格,给这些单元格分配一个唯一的区域编号(比如从2开始,避免和原始的0、1混淆),同时记录每个编号对应的区域单元格数量。

举个Python代码片段示例:

import collections

def mark_regions(grid):
    rows, cols = len(grid), len(grid[0])
    region_id = 2
    region_sizes = {}  # 键:区域编号,值:区域大小

    for i in range(rows):
        for j in range(cols):
            if grid[i][j] == 1:  # 找到未标记的▓▓
                # BFS遍历连通区域
                queue = collections.deque()
                queue.append((i, j))
                grid[i][j] = region_id
                size = 1

                while queue:
                    x, y = queue.popleft()
                    # 检查上下左右四个方向
                    for dx, dy in [(-1,0), (1,0), (0,-1), (0,1)]:
                        nx, ny = x + dx, y + dy
                        if 0 <= nx < rows and 0 <= ny < cols and grid[nx][ny] == 1:
                            grid[nx][ny] = region_id
                            size += 1
                            queue.append((nx, ny))
                
                region_sizes[region_id] = size
                region_id += 1
    return grid, region_sizes

2. 找出最大的区域编号

遍历region_sizes字典,找到值最大的那个键(也就是最大区域的编号)。如果有多个区域大小相同且都是最大值,随便选一个即可(比如选第一个遇到的)。

示例代码:

def find_largest_region(region_sizes):
    if not region_sizes:
        return None  # 没有任何▓▓区域
    # 按区域大小排序,取最大的那个编号
    return max(region_sizes, key=region_sizes.get)

3. 保留最大区域,其余转为░░

再次遍历网格,把所有不等于最大区域编号的单元格都设为0(░░),等于的设为1(▓▓)。

示例代码:

def keep_largest_region(grid, largest_id):
    rows, cols = len(grid), len(grid[0])
    for i in range(rows):
        for j in range(cols):
            if grid[i][j] == largest_id:
                grid[i][j] = 1
            else:
                grid[i][j] = 0
    return grid

整合调用示例

把上面的函数串起来,就能完成整个处理流程:

# 示例输入网格(░░=0,▓▓=1)
sample_grid = [
    [1, 1, 0, 0, 0],
    [1, 1, 0, 1, 1],
    [0, 0, 0, 1, 1],
    [1, 0, 0, 0, 0],
    [1, 1, 0, 0, 1]
]

# 步骤1:标记区域并统计大小
marked_grid, sizes = mark_regions(sample_grid)
# 步骤2:找最大区域编号
largest_id = find_largest_region(sizes)
# 步骤3:保留最大区域
result_grid = keep_largest_region(marked_grid, largest_id)

# 打印结果(用▓▓和░░展示)
for row in result_grid:
    print(''.join(['▓▓' if cell == 1 else '░░' for cell in row]))

这段代码运行后,就会只保留网格中单元格数量最多的那个连通▓▓区域,其余都变成░░。

内容的提问来源于stack exchange,提问作者Nikedemos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:12:10