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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:06:55