尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Kimi LeetCode 3459. 最长 V 形对角线段的长度 C语言实现

Kimi    LeetCode 3459. 最长 V 形对角线段的长度 C语言实现
📅 发布时间:2026/7/4 20:00:37

以下是 LeetCode 3459「最长 V 形对角线段的长度」的 C 语言实现。

解题思路

核心算法:记忆化搜索 (DFS + Memoization)

- 状态定义:`memo[i][j][dir][turn]` 表示从坐标 `(i,j)` 出发,当前移动方向为 `dir`,是否还能右转(`turn`)的情况下,后续路径的最大长度。
- 四个对角方向(按顺时针排列):
- `dir=0`: (1, 1) 右下
- `dir=1`: (1, -1) 左下
- `dir=2`: (-1, -1) 左上
- `dir=3`: (-1, 1) 右上
- 顺时针90度右转:`(dir + 1) % 4`
- 序列模式:`1 → 2 → 0 → 2 → 0 → ...`,下一个目标值用 `2 - target` 计算

复杂度:
- 时间:O(n × m × 4 × 2) = O(n × m)
- 空间:O(n × m × 4 × 2) = O(n × m)

---

C 代码

```c
#include <stdlib.h>

/**
* LeetCode 3459. 最长 V 形对角线段的长度 - C语言实现
* =====================================================
*
* 题目要求:
* 在 n x m 的矩阵中,找最长的 V 形对角线段。
* - 起点必须是 1
* - 后续值按 2, 0, 2, 0, ... 交替
* - 沿对角线方向移动
* - 最多允许一次顺时针 90 度转向
*
* 算法:记忆化搜索 (DFS + Memoization)
*/

// 四个对角方向(按顺时针排列):右下、左下、左上、右上
static const int DIRS[4][2] = {{1, 1}, {1, -1}, {-1, -1}, {-1, 1}};

// 扁平化访问记忆化数组:memo[i][j][dir][turn]
// 索引计算:(i * n + j) * 8 + dir * 2 + turn
static inline int* get_memo(int *memo, int n, int i, int j, int dir, int turn) {
return &memo[(i * n + j) * 8 + dir * 2 + turn];
}

/**
* DFS 搜索从 (i,j) 沿方向 dir 前进,期望值为 target 的最长路径
* @param turn: 1 表示还可以右转,0 表示已经转过或不能转
* @return: 从下一个合法格子开始的路径长度(不含当前(i,j))
*/
int dfs(int **grid, int *memo, int m, int n, int i, int j, int dir, int turn, int target) {
int ni = i + DIRS[dir][0];
int nj = j + DIRS[dir][1];

// 越界或值不匹配,路径终止
if (ni < 0 || ni >= m || nj < 0 || nj >= n || grid[ni][nj] != target) {
return 0;
}

// 查记忆化表
int *p = get_memo(memo, n, ni, nj, dir, turn);
if (*p != 0) {
return *p;
}

int next_target = 2 - target; // 2->0, 0->2

// 选择1:继续沿当前方向直行
int res = dfs(grid, memo, m, n, ni, nj, dir, turn, next_target) + 1;

// 选择2:如果还能右转,顺时针90度转向(dir -> (dir+1)%4)
if (turn) {
int turn_res = dfs(grid, memo, m, n, ni, nj, (dir + 1) % 4, 0, next_target) + 1;
if (turn_res > res) {
res = turn_res;
}
}

*p = res;
return res;
}

int lenOfVDiagonal(int** grid, int gridSize, int* gridColSize) {
int m = gridSize;
int n = gridColSize[0];

if (m == 0 || n == 0) {
return 0;
}

// 分配并初始化记忆化数组(全部置0)
// 每个格子8种状态:4方向 x 2种turn状态
int *memo = (int *)calloc(m * n * 8, sizeof(int));

int ans = 0;

// 遍历所有可能的起点
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
// 起点必须是 1
if (grid[i][j] != 1) {
continue;
}

// 尝试四个初始方向
for (int dir = 0; dir < 4; dir++) {
// dfs返回从(i,j)之后的路径长度,+1包含起点本身
int len = dfs(grid, memo, m, n, i, j, dir, 1, 2) + 1;
if (len > ans) {
ans = len;
}
}
}
}

free(memo);
return ans;
}
```

---

关键要点说明

要点 说明
方向数组顺序 必须按顺时针排列 `(右下→左下→左上→右上)`,这样 `(dir+1)%4` 才是正确的顺时针90度转向
目标值交替 `next_target = 2 - target` 巧妙实现 `2↔0` 交替
记忆化状态 每个格子 8 种状态(4方向 × 2种turn),用扁平化数组存储减少分配开销
起点处理 只有值为 `1` 的格子才能作为起点,初始目标值固定为 `2`

下载文件:[leetcode_3459.c](sandbox:///mnt/agents/output/leetcode_3459.c)

相关新闻

  • 3. 应用编程---信号
  • ComfyUI-WanVideoWrapper实现AI视频生成性能突破:径向注意力与FP8量化技术深度解析
  • 终极指南:3分钟学会用FanControl掌控Windows电脑风扇,告别噪音烦恼

最新新闻

  • OpenRadioss在汽车碰撞仿真中的应用:从模型建立到结果验证的完整流程
  • DVWA文件上传漏洞实战:从Low到High级别攻防与防御策略
  • OpenEuler bridge-utils常见问题解决:从FAQ到实战案例分析
  • Typical实战案例:构建类型安全的微服务数据交互系统
  • STM32F107VC与MC6470 IMU的硬件集成与数据融合实践
  • CANN/ge UDF错误码

日新闻

  • STM32F745VG与MC6470 IMU的高性能姿态控制系统设计
  • 机器不消费,人何以生存
  • AI项目操作手册编写规范与最佳实践

周新闻

  • Windows字体自定义终极方案:No!! MeiryoUI完全指南
  • Deepin Boot Maker:告别命令行,3分钟制作Linux启动盘的智能解决方案
  • Plain Craft Launcher 2:重新定义你的Minecraft游戏体验

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号