Kimi LeetCode LCP 31. 变换的迷宫 Rust实现

发布时间:2026/10/16 20:20:40

Kimi    LeetCode LCP 31. 变换的迷宫 Rust实现 以下是 LCP 31. 变换的迷宫 的 Rust 实现采用 BFS 状态压缩 的思路参考了 C 题解的状态设计 。---解题思路状态设计f[time][x][y][scroll_state] 表示在时刻 time 位于 (x, y)、卷轴使用状态为 scroll_state 时的最短步数。状态值 含义0 未使用任何卷轴1 只使用了临时消除术2 只使用了永久消除术3 两个卷轴都使用了关键细节- 每时刻可以上下左右移动一步或停留原地共 5 种选择- 临时消除术仅让下一时刻的指定位置变为空地用一次后消失- 永久消除术将指定位置永久变为空地需要记录该位置坐标 (px, py)后续所有时刻经过该位置都视为空地- 只要在迷宫变化结束前含最后时刻到达终点 (n-1, m-1) 即算成功---Rust 代码rustuse std::collections::VecDeque;struct Solution;impl Solution {pub fn escape_maze(maze: VecVecString) - bool {let layers maze.len();if layers 0 {return false;}let rows maze[0].len();if rows 0 {return false;}let cols maze[0][0].len();// 五个移动方向右、左、下、上、停留const DX: [i32; 5] [0, 0, 1, -1, 0];const DY: [i32; 5] [1, -1, 0, 0, 0];// 卷轴使用状态const NONE_USED: usize 0; // 未使用任何卷轴const ONLY_TEMP: usize 1; // 只使用了临时消除术const ONLY_PERM: usize 2; // 只使用了永久消除术const TEMP_PERM: usize 3; // 两个卷轴都使用了const INF: i32 i32::MAX / 2;/// 状态值记录到达该状态的步数和永久消除的位置#[derive(Clone, Copy)]struct StateVal {d: i32, // 到达该状态的步数px: i32, // 永久消除位置的 x 坐标-1 表示没有使用永久消除术py: i32, // 永久消除位置的 y 坐标-1 表示没有使用永久消除术}// DP 数组f[layer][row][col][scroll_state]let mut f: VecVecVecVecStateVal vec![vec![vec![vec![StateVal { d: INF, px: -1, py: -1 }; 4];cols];rows];layers];// BFS 队列存储 (时刻, 行, 列, 卷轴状态)let mut q: VecDeque(usize, usize, usize, usize) VecDeque::new();// 初始状态时刻 0 在起点 (0, 0)未使用任何卷轴f[0][0][0][NONE_USED] StateVal { d: 0, px: -1, py: -1 };q.push_back((0, 0, 0, NONE_USED));while let Some((c_layer, c_x, c_y, c_sc)) q.pop_front() {let c_opt f[c_layer][c_x][c_y][c_sc];let next_layer c_layer 1;// 下一时刻超出迷宫变化范围无法继续移动if next_layer layers {continue;}for dir in 0..5 {let nx c_x as i32 DX[dir];let ny c_y as i32 DY[dir];// 边界检查if nx 0 || nx rows as i32 || ny 0 || ny cols as i32 {continue;}let nx nx as usize;let ny ny as usize;// 检查下一时刻该位置是否是空地let next_is_empty maze[next_layer][nx].as_bytes()[ny] b.;// 检查是否是永久消除的位置永久消除后该位置始终可通行let is_perm_pos (c_sc ONLY_PERM || c_sc TEMP_PERM) c_opt.px nx as i32 c_opt.py ny as i32;if next_is_empty || is_perm_pos {// 该位置可通行卷轴状态保持不变if c_opt.d 1 f[next_layer][nx][ny][c_sc].d {f[next_layer][nx][ny][c_sc] StateVal {d: c_opt.d 1,px: c_opt.px,py: c_opt.py,};q.push_back((next_layer, nx, ny, c_sc));}continue;}// 下一时刻该位置是陷阱考虑使用卷轴// 状态 1只用临时可以再用永久消除术 - 状态 3if c_sc ONLY_TEMP {if c_opt.d 1 f[next_layer][nx][ny][TEMP_PERM].d {f[next_layer][nx][ny][TEMP_PERM] StateVal {d: c_opt.d 1,px: nx as i32, // 永久消除当前陷阱位置py: ny as i32,};q.push_back((next_layer, nx, ny, TEMP_PERM));}}// 状态 2只用永久可以再用临时消除术 - 状态 3if c_sc ONLY_PERM {if c_opt.px nx as i32 c_opt.py ny as i32 {// 当前位置已被永久消除直接通行前面已处理此处为保险if c_opt.d 1 f[next_layer][nx][ny][c_sc].d {f[next_layer][nx][ny][c_sc] StateVal {d: c_opt.d 1,px: c_opt.px,py: c_opt.py,};q.push_back((next_layer, nx, ny, c_sc));}} else {// 使用临时消除术消除当前陷阱进入状态 3if c_opt.d 1 f[next_layer][nx][ny][TEMP_PERM].d {f[next_layer][nx][ny][TEMP_PERM] StateVal {d: c_opt.d 1,px: c_opt.px,py: c_opt.py,};q.push_back((next_layer, nx, ny, TEMP_PERM));}}}// 状态 0都没用可以使用临时或永久消除术if c_sc NONE_USED {// 使用永久消除术 - 状态 2if c_opt.d 1 f[next_layer][nx][ny][ONLY_PERM].d {f[next_layer][nx][ny][ONLY_PERM] StateVal {d: c_opt.d 1,px: nx as i32,py: ny as i32,};q.push_back((next_layer, nx, ny, ONLY_PERM));}// 使用临时消除术 - 状态 1if c_opt.d 1 f[next_layer][nx][ny][ONLY_TEMP].d {f[next_layer][nx][ny][ONLY_TEMP] StateVal {d: c_opt.d 1,px: c_opt.px,py: c_opt.py,};q.push_back((next_layer, nx, ny, ONLY_TEMP));}}}}// 检查在任意时刻、任意卷轴状态下是否到达终点for layer in 0..layers {for sc in 0..4 {if f[layer][rows - 1][cols - 1][sc].d ! INF {return true;}}}false}}---复杂度分析- 时间复杂度O(T \times N \times M \times 4 \times 5)其中 T 为时刻数N \times M 为迷宫大小4 为卷轴状态数5 为移动方向数- 空间复杂度O(T \times N \times M \times 4)用于存储 DP 状态数组和 BFS 队列---下载文件[lcp31_escape_maze.rs](sandbox:///mnt/agents/output/lcp31_escape_maze.rs)
延伸阅读

更多相关文章

2026/10/17 9:30:10

Oracle 19c RAC登录风暴引发library cache lock生产故障分析

故障环境为 Exadata 一体机 Oracle 19.9 RAC,出现部分业务用户无法连接数据库、其他用户登录正常的现象,本文完整还原故障现象、排查思路、内核 Bug 根因、解决方案。一、故障现象 凌晨 01:45,生产数据库收到异常告警短信,告警等待…

2026/10/16 17:12:03

地狱般的三天

周五感觉嗓子有点不舒服,没有太当回事。周六进山去玩,找寻云台天瀑的源头,登台阶出了一身汗,在山里温度明显低,汗落了之后,身体发凉,又坐摩托车冲了风,回到家就感冒了。这一次有豆包…

2026/10/17 9:30:10

企业AI管理能力成熟度模型:五级评估框架与落地方法论

1. 从"有没有AI"到"会不会管AI":评估需求是怎么来的大约两年前,我跟着团队去一家制造业企业做智能化转型诊断。对方信息部门负责人开口第一句话就是:"我们去年上了三个算法项目,两个在POC之后就没有下文…

2026/10/17 9:30:10

KingbaseES实战:物联网时序数据写入与查询优化

物联网设备一多,时序数据就来了。设备上报的温湿度、振动频率、能耗读数、GPS轨迹,源源不断往库里灌。我这两年接触过不少物联网平台的项目,早期大家清一色用开源时序库,而最近国产数据库在时序场景上的进展确实让人眼前一亮。就拿…

2026/10/17 9:30:10

LLM微调实战指南:从LoRA/QLoRA选型到数据与避坑全解析

简介:面向有一定机器学习背景的研究人员与技术开发者,尤其适合算力有限的小型团队和个人,这份资源系统梳理了大规模语言模型微调的主流技术,涵盖Freeze、P-tuning、Prefix-Tuning、Prompt Tuning、P-tuning V1/V2、Lora与Qlora&am…

2026/10/17 9:30:10

SGMII技术全解析:从8B/10B编码到速率适配与工程避坑指南

简介:SGMII Specification V1.8 是串行千兆媒体独立接口(SGMII)的规范文档,面向 10/100/1000 以太网 PHY 与 MAC 之间的接口设计、验证与调试场景,适合硬件工程师、FPGA 开发者和网络协议研究者。文档描述了两条数据信…

2026/10/17 9:30:10

CE6.3中文版配置实战:从内核NLS到字体输入法的完整避坑指南

简介:CE6.3中文版即Cheat Engine 6.3的汉化版本,面向游戏修改爱好者、进阶玩家及程序调试人员,用于扫描、编辑游戏进程内存并实现数值锁定与脚本化修改。压缩包共78个文件,约7MB,以15个dll动态库、9个exe可执行程序为主…

2026/10/16 5:33:43

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/16 4:03:48

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/15 13:42:16

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/17 0:04:32

PlanarSLAM:面向曼哈顿世界的点线面联合SLAM系统

简介:本资源是面向机器人视觉与SLAM研究者的C开源RGB-D SLAM系统实现,专为结构化室内场景(如办公室、走廊)设计,通过融合点、线、平面三类几何特征并引入“曼哈顿世界”假设,显著提升位姿跟踪鲁棒性与稠密地…

2026/10/17 0:04:32

TDH Workflow调度实战:从DAG依赖驱动到任务编排与故障排查

1. 从一个调度脚本说起:TDH Workflow到底在解决什么问题第一次接触TDH的Workflow,是在一个数据清洗项目里。当时团队每天要跑几十个ETL任务,任务之间有严格的先后依赖——A表清洗完才能跑B表的关联,B表跑完才能触发C表的聚合。最开…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑