Python实现字母网格多方向遍历及目标单词检测咨询
以下实现默认输入的6x6网格为二维列表结构,例如grid = [['r','a','w','b','i','t'], ['x','a','y','c','z','h'], ...],每个元素为单个字符。所有函数支持两种调用模式:不传word参数时返回对应方向的所有字符序列列表,传word参数时直接返回布尔值,表示目标字符串是否存在于对应方向的序列中。
# 示例6x6测试网格,可替换为实际输入 grid = [ ['r', 'a', 'w', 'b', 'i', 't'], ['x', 'a', 'y', 'c', 'z', 'h'], ['p', 'q', 'r', 's', 't', 'u'], ['t', 'k', 'l', 'm', 'n', 'o'], ['u', 'v', 'w', 'x', 'y', 'z'], ['n', 'm', 'a', 'b', 'c', 'd'] ]
1. func_left:逐行从左到右遍历
直接拼接每一行的字符即可,逻辑最简单。
def func_left(grid, word=None): # 逐行拼接字符生成字符串 line_strs = [''.join(row) for row in grid] if word: # 检测word是否是任意行字符串的子串 return any(word in s for s in line_strs) return line_strs
输出示例:['rawbit', 'xayczh', 'pqrstu', 'tklmno', 'uvwxyz', 'nmabcd']
2. func_up:逐列从上到下遍历
按列号循环,每一列取所有行对应位置的字符拼接。
def func_up(grid, word=None): col_total = len(grid[0]) # 固定为6 col_strs = [] for col_idx in range(col_total): # 取所有行的第col_idx个字符,拼接为列字符串 cur_col = ''.join([grid[row_idx][col_idx] for row_idx in range(len(grid))]) col_strs.append(cur_col) if word: return any(word in s for s in col_strs) return col_strs
输出示例:['rxptun', 'aqkvm', 'wyrwa', 'bsmxb', 'iznyc', 'thouzd']
3. func_slideright:沿右下对角线(左下向右上延伸)遍历
这类对角线的核心特征是行索引 + 列索引 = 固定值,固定值范围从0(0+0)到10(5+5),按固定值从小到大遍历即可拿到所有目标序列。
def func_slideright(grid, word=None): n = len(grid) # 网格边长,固定为6 diag_strs = [] # 行+列的和的范围是0到2n-2,也就是0到10 for sum_val in range(2*n - 1): cur_diag = [] for row_idx in range(n): col_idx = sum_val - row_idx # 只保留合法的列索引值 if 0 <= col_idx < n: cur_diag.append(grid[row_idx][col_idx]) diag_strs.append(''.join(cur_diag)) if word: return any(word in s for s in diag_strs) return diag_strs
输出示例:['r', 'xa', 'paw', 'tyqa', 'ulkry', 'nmwscb', 'mvoniz', 'abxzt', 'cyu', 'zd', 'd'],符合你提到的短序列输出规则。
4. func_slideleft:沿左下对角线(右下向左上延伸)遍历
这类对角线的核心特征是行索引 - 列索引 = 固定值,固定值范围从-5(0-5)到5(5-0),按固定值从小到大遍历即可拿到所有目标序列。
def func_slideleft(grid, word=None): n = len(grid) diag_strs = [] # 行-列的差的范围是-(n-1)到n-1,也就是-5到5 for diff_val in range(-(n-1), n): cur_diag = [] for row_idx in range(n): col_idx = row_idx - diff_val # 只保留合法的列索引值 if 0 <= col_idx < n: cur_diag.append(grid[row_idx][col_idx]) diag_strs.append(''.join(cur_diag)) if word: return any(word in s for s in diag_strs) return diag_strs
输出示例:['t', 'ih', 'bzu', 'wcso', 'aytnd', 'rxsma', 'palxb', 'xqvyc', 'pkwz', 'um', 'n'],符合你提到的短序列输出规则。
测试调用示例
print(func_left(grid)) # 输出所有行序列 print(func_up(grid, word="rxpt")) # 检测"rxpt"是否存在于列序列中,返回True/False print(func_slideright(grid)) print(func_slideleft(grid))
内容的提问来源于stack exchange,提问作者Bruffff

