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

如何在二维字符列表中搜索单词并生成含行列号与方向的元组?

解决二维字母列表中的单词搜索问题

看起来你已经完成了文件读取和二维列表转换的基础工作,接下来的核心是检查连续字母是否匹配目标单词,并记录起始位置和方向。我来帮你梳理逻辑并补全代码:

第一步:定义搜索方向

首先我们需要明确所有可能的搜索方向,用「行偏移量,列偏移量」的元组来表示,同时对应方向名称:

# 方向定义:(行偏移, 列偏移, 方向名称)
directions = [
    (0, 1, "East"),    # 向右
    (0, -1, "West"),   # 向左
    (1, 0, "South"),   # 向下
    (-1, 0, "North"),  # 向上
    (1, 1, "Southeast"), # 右下
    (-1, 1, "Northeast"), # 右上
    (1, -1, "Southwest"), # 左下
    (-1, -1, "Northwest") # 左上
]

第二步:遍历所有可能的起始位置

我们需要遍历二维列表的每一个单元格作为起始点,然后对每个起始点尝试所有方向,检查是否能匹配目标单词:

word = "THIS"
# 用with语句读取文件更安全,会自动关闭文件
with open("harf_uzayi.txt", "r") as file:
    # 去掉每行末尾的换行符,避免列表混入无效字符
    letter_space = [[char for char in line.strip()] for line in file]

word_length = len(word)
rows = len(letter_space)
if rows == 0:
    print("文件为空,无法搜索")
    exit()
cols = len(letter_space[0])

# 打印表头,和预期输出格式一致
print("WORD line number column number direction")

# 遍历每个起始单元格
for row_idx in range(rows):
    for col_idx in range(cols):
        # 先过滤掉不是单词首字母的单元格,减少无效检查
        if letter_space[row_idx][col_idx] != word[0]:
            continue
        # 对每个符合条件的起始点,尝试所有方向
        for dr, dc, dir_name in directions:
            # 计算该方向下单词末尾的位置,先判断是否越界
            end_row = row_idx + dr * (word_length - 1)
            end_col = col_idx + dc * (word_length - 1)
            if end_row < 0 or end_row >= rows or end_col < 0 or end_col >= cols:
                continue
            # 检查该方向上的所有字母是否匹配单词
            match_flag = True
            for i in range(1, word_length):
                current_row = row_idx + dr * i
                current_col = col_idx + dc * i
                if letter_space[current_row][current_col] != word[i]:
                    match_flag = False
                    break
            # 如果匹配成功,按格式输出(行号列号从1开始计数)
            if match_flag:
                print(f"{word} {row_idx + 1} {col_idx + 1} {dir_name}")
                # 如果只需要第一个匹配结果,可以直接退出程序
                # exit()

关键逻辑说明

  1. 边界检查:在尝试某个方向前,先计算该方向的结束位置是否超出二维列表范围,避免索引错误。
  2. 首字母过滤:先判断当前单元格是否是单词的首字母,减少不必要的方向检查,提升效率。
  3. 方向匹配:从起始点出发,沿着方向偏移量逐个检查后续字母是否和单词对应位置一致。

针对预期输出的说明

你的预期输出里行号是4、列号20,这说明行号列号是从1开始计数的,代码里通过row_idx+1和col_idx+1实现了这一点,和示例输出格式完全对齐。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:07:06