如何用Python实现完整的无对角线单词搜索器?代码问题排查
优化单词搜索代码,找回遗漏的犯罪单词
看起来你的代码思路方向是对的——检查水平(正/逆)和垂直(正/逆)方向的单词,但几个小细节错误导致遗漏了目标单词。我帮你修正了代码,并解释了关键问题所在:
优化后的代码
def crossword(): crimes = ["JAYWALKING", "BURGLARY", "LAUNDERING", "BADSINGING", "REDRUM", "SMOKING", "BEINGSMELLY", "CONNING", "SCAMS", "LOITERING"] # 使用with语句安全读取文件,自动处理关闭逻辑 with open("confession.txt", "r") as confession: grid = [] for line in confession: # split()自动处理任意空白字符,避免空元素干扰矩阵结构 row = line.strip().split() grid.append(row) found_crimes = [] rows = len(grid) cols = len(grid[0]) if rows > 0 else 0 # 处理空矩阵的边界情况 # 检查水平方向(正序+逆序) for row_idx in range(rows): forward = ''.join(grid[row_idx]) backward = ''.join(reversed(grid[row_idx])) for crime in crimes: if crime in forward or crime in backward: found_crimes.append(crime) # 检查垂直方向(正序+逆序) for col_idx in range(cols): # 正序拼接整列 forward = ''.join([grid[row_idx][col_idx] for row_idx in range(rows)]) # 逆序拼接整列(从最后一行往上取元素) backward = ''.join([grid[rows - 1 - row_idx][col_idx] for row_idx in range(rows)]) for crime in crimes: if crime in forward or crime in backward: found_crimes.append(crime) # 去重处理,保留首次发现的顺序 unique_crimes = [] seen = set() for crime in found_crimes: if crime not in seen: seen.add(crime) unique_crimes.append(crime) return unique_crimes print("Gentleman GoGo is guilty of:") print(crossword())
关键修改点说明
- 修复垂直逆序拼接错误:你原来的垂直逆序代码是取
empty_list[j][m-1-i],这其实是在取同一行的另一列,完全不是垂直方向的逆序。现在改为从最后一行到第一行取对应列的字母,正确生成垂直逆序字符串——这应该是REDRUM这类垂直逆序单词没被找到的核心原因。 - 文件读取更可靠:用
with语句管理文件,避免忘记关闭文件;用split()代替split(' '),能自动处理多个空格、首尾空白等情况,保证每行都是15个字母,不会出现空元素干扰拼接。 - 代码简化与可读性提升:用
''.join()和reversed()代替手动循环拼接字符串,既简洁又不容易出错,也方便后续调试。 - 去重处理:同一个单词可能在多个方向被找到,添加去重逻辑避免重复输出,同时保留单词首次被发现的顺序。
调试建议
如果还有单词没被识别,可以在代码中添加打印语句,输出每个水平/垂直的正序、逆序字符串,直接检查目标单词是否存在:
# 在水平循环内添加 print(f"Row {row_idx} forward: {forward}") print(f"Row {row_idx} backward: {backward}") # 在垂直循环内添加 print(f"Column {col_idx} forward: {forward}") print(f"Column {col_idx} backward: {backward}")
这样能直观定位到哪个方向的拼接出了问题,或者确认目标单词是否真的在矩阵中。
内容的提问来源于stack exchange,提问作者random_student
相关产品推荐
相关产品推荐

