如何基于指定坐标隔离2D布尔数组中的特定岛屿?
提取指定坐标所在岛屿的实现方案
问题理解
咱们的需求是:给一个由1(陆地)和0(水域)组成的二维数组,找到指定坐标那块陆地所属的整个岛屿(岛屿是指仅通过上下左右四个方向连通的陆地,对角线不算),然后生成一个新数组——只有这个岛屿保留1,其他区域全部设为0。
举个题目里的例子:
输入的一维序列转成5行6列的二维数组是:
1 0 0 1 1 0 0 1 0 0 0 1 1 1 1 0 0 0 0 1 0 1 1 1 1 1 1 0 0 0指定坐标是
[1][2](也就是第二行第三列,索引从0开始计算),最终输出的一维序列就是题目里给出的那串仅保留目标岛屿1的结果。
解决思路
最直观的办法就是用深度优先搜索(DFS) 或者广度优先搜索(BFS) 把目标坐标连通的所有陆地都标记出来:
- 先确认目标坐标是不是陆地,如果是水域,直接返回全0数组就行。
- 创建一个和原数组尺寸一致的新数组,初始时全部填充为
0。 - 从目标坐标出发,往上下左右四个方向遍历连通的陆地:
- 每找到一块陆地,就把新数组对应位置改成
1。 - 为了避免重复遍历同一块陆地,可以把原数组中已访问的陆地改成
0(或者单独用一个访问标记矩阵也可以)。
- 每找到一块陆地,就把新数组对应位置改成
Python代码实现
我用DFS写了个示例,逻辑非常清晰:
def extract_target_island(grid, target_row, target_col): rows = len(grid) if rows == 0: return [] cols = len(grid[0]) # 初始化结果数组,全部填充为0 result = [[0]*cols for _ in range(rows)] # 先判断目标位置是否为陆地,不是的话直接返回全0数组 if grid[target_row][target_col] != 1: return result # 定义上下左右四个方向的偏移量 directions = [(-1,0), (1,0), (0,-1), (0,1)] def dfs(row, col): # 越界或者当前位置不是陆地,直接退出递归 if row < 0 or row >= rows or col <0 or col >= cols or grid[row][col] !=1: return # 将原数组的当前陆地设为0,避免重复访问 grid[row][col] = 0 # 结果数组中标记当前位置为陆地 result[row][col] = 1 # 遍历四个方向的相邻位置 for dr, dc in directions: dfs(row+dr, col+dc) # 从目标坐标开始遍历整个岛屿 dfs(target_row, target_col) # 将二维结果数组转换为一维序列,匹配题目要求的输出格式 return [num for row in result for num in row] # 测试题目中的示例 original_grid = [ [1,0,0,1,1,0], [0,1,0,0,0,1], [1,1,1,0,0,0], [0,1,0,1,1,1], [1,1,1,0,0,0] ] # 目标坐标为行索引1,列索引2(对应第二行第三列) output_sequence = extract_target_island(original_grid, 1, 2) print("输出序列:", ' '.join(map(str, output_sequence)))
代码解释
- 先做了边界校验,如果目标位置不是陆地,直接返回全0数组,避免无效计算。
- DFS函数负责递归遍历所有连通的陆地,每遍历一块就修改原数组标记为已访问,同时在结果数组中标记为陆地。
- 最后把二维的结果数组转换为一维序列,和题目给出的输出格式完全匹配。
运行这段代码,输出的序列就和题目里的示例完全一致啦。
内容的提问来源于stack exchange,提问作者Mike Jagger
相关产品推荐
相关产品推荐

