如何在二维字符列表中搜索单词并生成含行列号与方向的元组?
解决二维字母列表中的单词搜索问题
看起来你已经完成了文件读取和二维列表转换的基础工作,接下来的核心是检查连续字母是否匹配目标单词,并记录起始位置和方向。我来帮你梳理逻辑并补全代码:
第一步:定义搜索方向
首先我们需要明确所有可能的搜索方向,用「行偏移量,列偏移量」的元组来表示,同时对应方向名称:
# 方向定义:(行偏移, 列偏移, 方向名称) 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()
关键逻辑说明
- 边界检查:在尝试某个方向前,先计算该方向的结束位置是否超出二维列表范围,避免索引错误。
- 首字母过滤:先判断当前单元格是否是单词的首字母,减少不必要的方向检查,提升效率。
- 方向匹配:从起始点出发,沿着方向偏移量逐个检查后续字母是否和单词对应位置一致。
针对预期输出的说明
你的预期输出里行号是4、列号20,这说明行号列号是从1开始计数的,代码里通过row_idx+1和col_idx+1实现了这一点,和示例输出格式完全对齐。
内容的提问来源于stack exchange,提问作者mcora
相关产品推荐
相关产品推荐

