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

Python单词搜索求解器结果反转及漏检问题技术求助

Python单词搜索求解器问题修复指南

1. 结果显示逻辑反转修复

当前代码会把找到的单词替换为符号、保留其他字母,和需求完全相反。要实现仅保留找到的单词字符,其余替换为短横线,需先标记所有单词所在位置,再根据标记生成结果:

修改思路

  • 创建与网格尺寸一致的布尔矩阵,初始全为False,用于标记单词字符的位置
  • 找到目标单词时,将对应位置的标记设为True
  • 最后遍历网格,标记为True的保留原字符,否则替换为'-'

修改后的核心代码

def solve_word_search(words, grid):
    rows = len(grid)
    cols = len(grid[0])
    dirs = [(1, 1), (1, 0), (0, 1), (1, -1), (-1, 1), (0, -1), (-1, 0), (-1, -1)]
    
    # 初始化标记矩阵,记录哪些位置属于单词
    is_word_char = [[False for _ in range(cols)] for _ in range(rows)]
    
    for word in words:
        # 统一为小写,避免大小写不匹配
        target_word = word.lower()
        word_len = len(target_word)
        for r in range(rows):
            for c in range(cols):
                # 提前过滤首字母不匹配的情况,减少无效遍历
                if grid[r][c].lower() != target_word[0]:
                    continue
                for d in dirs:
                    dr, dc = d
                    # 提前判断单词末尾是否在网格范围内,避免越界检查
                    end_r = r + (word_len - 1) * dr
                    end_c = c + (word_len - 1) * dc
                    if not (0 <= end_r < rows and 0 <= end_c < cols):
                        continue
                    # 逐字符匹配
                    match = True
                    for i in range(word_len):
                        current_char = grid[r + i*dr][c + i*dc].lower()
                        if current_char != target_word[i]:
                            match = False
                            break
                    if match:
                        # 标记单词所在的所有位置
                        for i in range(word_len):
                            is_word_char[r + i*dr][c + i*dc] = True
                        break
    
    # 根据标记生成最终结果
    result = []
    for r in range(rows):
        new_row = []
        for c in range(cols):
            new_row.append(grid[r][c] if is_word_char[r][c] else '-')
        result.append(new_row)
    
    return result

2. 部分单词无法识别的排查与解决技巧

以"yellow"无法识别为例,按以下步骤排查:

常见原因及解决

  • 大小写不匹配:检查单词文件中的"yellow"是否为小写,网格字母是否统一为小写。代码中已添加.lower()转换,确保匹配不受大小写影响。
  • 边界判断漏洞:原代码在all()中逐次检查边界,可提前判断单词末尾位置是否在网格内(如修改后的代码),避免无效检查。
  • 单词实际不存在:手动核对网格,确认"yellow"是否真的存在,且方向属于8种遍历方向(横、竖、4种斜向)。
  • 遍历逻辑遗漏:原代码找到匹配后break仅跳出方向循环,若需确保所有方向被检查,可移除该break(但会重复标记同一单词的多个出现)。

调试技巧

在字符匹配循环中添加打印,直观查看匹配失败的位置:

# 在逐字符匹配的循环中加入
for i in range(word_len):
    current_char = grid[r + i*dr][c + i*dc].lower()
    print(f"Checking {target_word[i]} vs {current_char} at ({r+i*dr}, {c+i*dc})")
    if current_char != target_word[i]:
        match = False
        break

完整修改后代码

import string

def solve_word_search(words, grid):
    rows = len(grid)
    cols = len(grid[0])
    dirs = [(1, 1), (1, 0), (0, 1), (1, -1), (-1, 1), (0, -1), (-1, 0), (-1, -1)]
    
    is_word_char = [[False for _ in range(cols)] for _ in range(rows)]
    
    for word in words:
        target_word = word.lower()
        word_len = len(target_word)
        for r in range(rows):
            for c in range(cols):
                if grid[r][c].lower() != target_word[0]:
                    continue
                for d in dirs:
                    dr, dc = d
                    end_r = r + (word_len - 1) * dr
                    end_c = c + (word_len - 1) * dc
                    if not (0 <= end_r < rows and 0 <= end_c < cols):
                        continue
                    match = True
                    for i in range(word_len):
                        current_char = grid[r + i*dr][c + i*dc].lower()
                        if current_char != target_word[i]:
                            match = False
                            break
                    if match:
                        for i in range(word_len):
                            is_word_char[r + i*dr][c + i*dc] = True
                        break
    
    result = []
    for r in range(rows):
        new_row = []
        for c in range(cols):
            new_row.append(grid[r][c] if is_word_char[r][c] else '-')
        result.append(new_row)
    
    return result

def main():
    words_file = input("Enter the name of the file containing the words: ")
    grid_file = input("Enter the name of the file containing the grid: ")
    
    with open(words_file, 'r') as f:
        words = f.read().splitlines()
    
    with open(grid_file, 'r') as f:
        grid = [list(row.strip()) for row in f.readlines()]
    
    solved_grid = solve_word_search(words, grid)
    for row in solved_grid:
        print(" ".join(row))

if __name__ == '__main__':
    main()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 14:06:56