当前位置: 首页 > 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.gsyq.cn/news/1552354.html

相关文章:

  • 串口服务器波特率踩坑记录
  • 口碑好的洗扫一体机专业公司,你知道几个 - mypinpai
  • 零成本上手AI测试工具:从核心原理到实战选型指南
  • YOLOv8-face轻量化人脸检测:从架构设计到边缘部署的全栈技术实践
  • AI辅助网络文学创作的合规方法论与实践路径
  • OpenCore Legacy Patcher终极解密:老Mac重生计划的技术突破与实战验证
  • 手机怎么调整图片分辨率?用秒转工具箱改像素和DPI - 玩机日常
  • PReLU与SELU工程实战:负向敏感度调节与自归一化落地指南
  • Audacity音频编辑:如何用开源工具解决专业音频处理难题?
  • 2026北京寰亚艺考面授教学效果深度测评 价格透明避坑指南 口碑实力之选 - mypinpai
  • 资质齐全的复印机出租公司如何选? - myqiye
  • 2026年6月目前靠谱的工业链条直销厂家推荐,非标链条/链条/不锈钢链条/工业链条,工业链条源头厂家哪家好 - 品牌推荐师
  • 小波Elman神经网络:多尺度时间序列预测的工程实践
  • 仿 Boots 大规模钓鱼攻击的技术机理与防御研究
  • 为什么机器学习工程师偏爱Colab:环境一致性与协作效率实战解析
  • [Android] Fluid Live Wallpaper V1.8.0流体动态壁纸高级版-4K液体流动,手指触摸变化
  • Windows性能分析实战:从卡顿根因定位到系统调优全流程
  • 深度哈希实战:端到端训练实现毫秒级相似性搜索
  • CRISP-ML(Q):面向落地的机器学习工程化标准流程
  • ML生产化不是部署模型,而是构建可信决策系统
  • Harness Engineering:从“使用AI“到“驾驭AI“的范式跃迁
  • 小模型接管前沿模型的四类确定性场景与工程落地方法
  • Word2Vec Skip-Gram 模型
  • AI代码评审落地失败的三大结构性断点与工程解法
  • 高校AI落地四层防御体系:从业务信任到决策闭环
  • 自主飞行系统实战解析:从模块化架构到适航落地
  • AI驱动数字孪生的实时闭环:从建模到产线落地的7个关键步骤
  • 多维聚合不是终点:让聚合结果可再操作的数据变形术
  • 2026年好用的网层板加工厂,金帆丝网口碑出众 - mypinpai
  • 低功耗高精度ADC选型:Σ-Δ架构原理与TC3402实战应用