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
相关产品推荐
相关产品推荐

