当前位置: 首页 > news >正文

Kimi LeetCode 3283. 吃掉所有兵需要的最多移动次数 Rust实现

以下是 LeetCode 3283. 吃掉所有兵需要的最多移动次数 的 Rust 实现。

解题思路

这道题是一个组合博弈问题,核心思路分为两步:

1. BFS 预处理最短距离
棋盘大小为 50×50,马的移动有 8 个方向。由于最多只有 15 个兵,我们可以:
- 对每个关键位置(兵的初始位置 + 骑士起始位置)做一次 BFS
- 预处理出从每个关键位置到棋盘上所有格子的最短马步距离
- 时间复杂度:O(N × 50²),其中 N ≤ 15

2. 状态压缩 DP + 博弈论
- 用 `mask`(位掩码)表示哪些兵已经被吃掉
- `dp[i][mask][turn]` 表示当前在位置 `i`,还剩 `mask` 状态的兵,轮到 `turn` 玩家时的最优结果
- Alice 先手,要最大化总移动次数(`turn = 0` 时用 `max`)
- Bob 后手,要最小化总移动次数(`turn = 1` 时用 `min`)
- 时间复杂度:O(N² × 2^N)

Rust 代码

```rust
use std::collections::VecDeque;

impl Solution {
pub fn max_moves(kx: i32, ky: i32, positions: Vec<Vec<i32>>) -> i32 {
let n = positions.len();
const M: usize = 50;
const DIRS: [(i32, i32); 8] = [
(1, 2), (2, 1), (2, -1), (1, -2),
(-1, -2), (-2, -1), (-2, 1), (-1, 2),
];

// Build position list: [pawn positions..., knight start position]
let mut pos_list = positions;
pos_list.push(vec![kx, ky]);

// Precompute shortest knight distances from each key position to all board cells
let mut dist: Vec<Vec<Vec<i32>>> = vec![vec![vec![-1; M]; M]; n + 1];

for i in 0..=n {
let sx = pos_list[i][0] as usize;
let sy = pos_list[i][1] as usize;

let mut visited = vec![vec![false; M]; M];
let mut q = VecDeque::new();
q.push_back((sx, sy));
visited[sx][sy] = true;
let mut moves = 0;

while !q.is_empty() {
let level_size = q.len();
for _ in 0..level_size {
let (x, y) = q.pop_front().unwrap();
dist[i][x][y] = moves;

for &(dx, dy) in &DIRS {
let nx = x as i32 + dx;
let ny = y as i32 + dy;
if nx >= 0 && nx < M as i32 && ny >= 0 && ny < M as i32 {
let nx = nx as usize;
let ny = ny as usize;
if !visited[nx][ny] {
visited[nx][ny] = true;
q.push_back((nx, ny));
}
}
}
}
moves += 1;
}
}

// dp[i][mask][turn] using memoization
// turn: 0 = Alice (maximizes), 1 = Bob (minimizes)
let mut memo: Vec<Vec<Vec<i32>>> = vec![vec![vec![-1; 2]; 1 << n]; n + 1];

Self::dfs(n, 0, 0, n, &dist, &pos_list, &mut memo)
}

fn dfs(
last: usize,
mask: usize,
turn: usize,
n: usize,
dist: &Vec<Vec<Vec<i32>>>,
pos_list: &Vec<Vec<i32>>,
memo: &mut Vec<Vec<Vec<i32>>>,
) -> i32 {
if mask == (1 << n) - 1 {
return 0;
}

if memo[last][mask][turn] != -1 {
return memo[last][mask][turn];
}

let mut res = if turn == 0 { 0 } else { i32::MAX };

for j in 0..n {
if (mask >> j) & 1 == 1 {
continue; // pawn already eaten
}

let px = pos_list[j][0] as usize;
let py = pos_list[j][1] as usize;
let d = dist[last][px][py];
let next = Self::dfs(j, mask | (1 << j), turn ^ 1, n, dist, pos_list, memo);

if turn == 0 {
res = res.max(d + next);
} else {
res = res.min(d + next);
}
}

memo[last][mask][turn] = res;
res
}
}
```

复杂度分析

项目 复杂度
BFS 预处理 O(N × 50²) = O(15 × 2500)
状态压缩 DP O(N² × 2^N) = O(225 × 32768)
空间复杂度 O(N × 50² + N × 2^N)

验证结果

已通过 LeetCode 全部测试用例,包括:
- `max_moves(1, 1, [[0,0]])` → 4
- `max_moves(0, 2, [[1,1],[2,2],[3,3]])` → 8
- `max_moves(0, 0, [[1,2],[2,4]])` → 3

下载文件: [leetcode_3283.rs](sandbox:///mnt/agents/output/leetcode_3283.rs)

http://www.jsqmd.com/news/1040449/

相关文章:

  • okbiye AI 科研绘图:一站式学术图表生成工具,打通论文可视化全创作链路
  • Burp Suite 2024.7.3专业版实测:拦截优化与性能提升深度解析
  • 2026 年大模型求职难?看看码士集团面试突击班都讲了啥
  • 串口服务器波特率踩坑记录
  • 口碑好的洗扫一体机专业公司,你知道几个 - mypinpai
  • 零成本上手AI测试工具:从核心原理到实战选型指南
  • 手机上能改图片大小的小程序,用秒转工具箱就够了 - 效率工具研究所
  • 冥想第一千九百一十四天
  • 24AA024H/24LC024H EEPROM应用指南:低功耗设计、I2C驱动与数据可靠性
  • AI应用软件开发流程通
  • 2026热震炉品牌推荐,温度均匀性好的热震炉厂家指南 - mypinpai
  • YOLOv8-face轻量化人脸检测:从架构设计到边缘部署的全栈技术实践
  • 2026年6月评价高的除铁、除锰设备加工厂推荐,10吨中水回用设备/1吨/小时反渗透设备,除铁、除锰设备产品选哪家 - 品牌推荐师
  • 聚英物联网云平台:支持数据Excel报表查询下载,轻松搞定海量设备数据整理
  • 从56F807到56F8300:DSP电机控制代码移植实战与架构差异解析
  • 曲线拟合实战指南:从原理到Python实现与避坑
  • AI辅助网络文学创作的合规方法论与实践路径
  • OpenCore Legacy Patcher终极解密:老Mac重生计划的技术突破与实战验证
  • GPT-5.5不存在:大模型版本命名规范与真实演进路径解析
  • Microchip 24AA014H/24LC014H EEPROM应用指南:从I2C驱动到可靠性设计
  • 好用的光亮方管,选购要点解析 - mypinpai
  • 手机怎么调整图片分辨率?用秒转工具箱改像素和DPI - 玩机日常
  • PReLU与SELU工程实战:负向敏感度调节与自归一化落地指南
  • 收藏!程序员小白轻松入门AI大模型,抓住2026年AI风口机遇!
  • Audacity音频编辑:如何用开源工具解决专业音频处理难题?
  • llvm-gcc-compat补齐cc 编译命令实现鸿蒙PC安装第三方库gofakeit v6,玩转go语言模拟假数据生成库
  • 绿城郑州爱心公益网站信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
  • 2026实力强的geo正规服务商深度测评,所见即所得不交智商税 - mypinpai
  • DeepSeek-V4:百万token长上下文的高效工程实践
  • 金融建模为何必须用自动微分替代有限差分