以下是 LeetCode 3459. 最长 V 形对角线段的长度 的 Python3 实现已通过全部示例验证pythonimport functoolsfrom typing import Listclass Solution:def lenOfVDiagonal(self, grid: List[List[int]]) - int:3459. 最长 V 形对角线段的长度思路记忆化搜索DFS 缓存从每个值为1的格子出发沿4个对角线方向搜索。序列规则1 - 2 - 0 - 2 - 0 - ...1之后是2然后0和2交替最多可以顺时针转90度一次。四个对角线方向顺时针排列0: 右上 (-1, 1)1: 右下 (1, 1)2: 左下 (1, -1)3: 左上 (-1, -1)顺时针转90度dir - (dir 1) % 4DIRS ((-1, 1), (1, 1), (1, -1), (-1, -1))functools.lru_cache(maxsizeNone)def dfs(i: int, j: int, turned: bool, num: int, dir_idx: int) - int:返回从 (i,j) 出发沿方向 dir_idx当前期望值为 num是否已转过弯 turned能延伸的最长路径长度包含当前格子。# 越界检查if i 0 or i len(grid) or j 0 or j len(grid[0]):return 0# 值不匹配if grid[i][j] ! num:return 0# 下一个期望值2和0交替1之后是2next_num 0 if num 2 else 2dx, dy DIRS[dir_idx]# 选择1继续沿原方向走res 1 dfs(i dx, j dy, turned, next_num, dir_idx)# 选择2如果没转过弯顺时针转90度if not turned:next_dir (dir_idx 1) % 4ndx, ndy DIRS[next_dir]res max(res, 1 dfs(i ndx, j ndy, True, next_num, next_dir))return resans 0for i, row in enumerate(grid):for j, val in enumerate(row):if val 1:# 从每个1出发尝试4个方向for d, (dx, dy) in enumerate(DIRS):ans max(ans, dfs(i dx, j dy, False, 2, d) 1)return ans核心思路1. 起点必须从值为 1 的格子开始2. 序列规则1 → 2 → 0 → 2 → 0 → ...1 之后是 2然后 0 和 2 交替3. 移动方向4 个对角线方向按顺时针排列4. 转弯限制最多顺时针转 90° 一次dir → (dir 1) % 45. 记忆化dfs(i, j, turned, num, dir_idx) 缓存状态避免重复计算验证结果全部 4 个示例均通过 ✓