N×N网格中5个连续空格序列的查找技术需求
搞定N×N网格中5个连续空格序列的问题
嘿,我来帮你解决这个找网格里连续空格的需求!不管是水平、垂直还是对角线方向的5个连续空格,咱们都能精准找出来,下面是具体的思路和实现方案:
核心思路拆解
要找5个连续的空格,关键要覆盖四个方向:水平向右、垂直向下、右下对角线、右上对角线(为啥只查这四个?因为反过来的方向比如向左、向上,其实会和其他起点的检查重复,这样能避免重复找同一个序列)。每个位置都要往这四个方向挨个检查,只要能凑齐连续5个空格,就把这个序列记录下来。
具体操作步骤
- 先摸清楚网格的边界:从字典的所有坐标键里,找出最大和最小的x、y值,这样就知道哪些位置是有效的,不会越界。
- 定义四个方向的偏移量:用
[(0,1), (1,0), (1,1), (1,-1)]分别代表右、下、右下、右上这四个方向。 - 遍历网格里的每一个位置:
- 如果当前位置是空格
" ",就逐个方向检查后续4个位置(加上当前正好5个)。 - 每一步都要确认后续位置在网格里,而且也是空格,要是中间有一个不符合,就直接跳过这个方向。
- 要是凑齐了5个连续空格,就把这个序列存起来,还要注意去重,避免同一个序列被多次记录。
- 如果当前位置是空格
可直接运行的Python代码示例
def find_five_consecutive_spaces(grid): # 先处理空网格的情况 coords = list(grid.keys()) if not coords: return [] # 确定网格的有效坐标范围 max_x = max(x for x, y in coords) min_x = min(x for x, y in coords) max_y = max(y for x, y in coords) min_y = min(y for x, y in coords) # 四个要检查的方向:右、下、右下、右上 directions = [(0, 1), (1, 0), (1, 1), (1, -1)] sequences = [] # 用集合来存已找到的序列,避免重复 seen = set() for (x, y) in coords: # 当前位置不是空格就跳过 if grid[(x, y)] != " ": continue for dx, dy in directions: current_seq = [(x, y)] valid = True # 检查后续4个位置 for i in range(1, 5): nx = x + dx * i ny = y + dy * i # 检查坐标是否在网格里,且对应值是空格 if (nx, ny) not in grid or grid[(nx, ny)] != " ": valid = False break current_seq.append((nx, ny)) if valid: # 把序列排序后转成元组,方便去重 sorted_seq = tuple(sorted(current_seq)) if sorted_seq not in seen: seen.add(sorted_seq) sequences.append(current_seq) return sequences # 举个例子测试一下 sample_grid = { (0,0): "Yes", (0,1): " ", (0,2): " ", (0,3): " ", (0,4): " ", (0,5): " ", (1,0): " ", (1,1): " ", (1,2): "No", (1,3): " ", (1,4): " ", (1,5): " ", (2,0): " ", (2,1): " ", (2,2): " ", (2,3): " ", (2,4): " ", (2,5): "Yes", (3,0): " ", (3,1): "No", (3,2): " ", (3,3): " ", (3,4): " ", (3,5): " ", (4,0): " ", (4,1): " ", (4,2): " ", (4,3): " ", (4,4): " ", (4,5): " ", (5,0): "No", (5,1): " ", (5,2): " ", (5,3): " ", (5,4): " ", (5,5): " " } # 运行函数并打印结果 found_sequences = find_five_consecutive_spaces(sample_grid) for idx, seq in enumerate(found_sequences, 1): print(f"找到第{idx}个连续空格序列:{seq}")
几个要注意的细节
- 边界检查:一定要确认后续的坐标存在于网格字典中,不然会报错,代码里用
(nx, ny) not in grid来判断就很稳妥。 - 去重处理:同一个连续序列可能从不同的起点被查到(比如水平序列的第一个和第二个位置),所以我们把序列排序后存入集合,确保每个序列只记录一次。
- 坐标兼容性:不管你的网格坐标是从0开始还是从1开始(比如示例里的(1,2)),代码都能自动适配,因为它是从给定的坐标里提取边界的。
- 空格匹配:要严格匹配
" "(空格字符),别和空字符串""搞混了,不然会漏找或者误判。
内容的提问来源于stack exchange,提问作者readytotaste
相关产品推荐
相关产品推荐

