Algorithms first
蛇梯棋 · 交互式算法学习
求从 1 到 n² 的最少掷骰次数。
#909 · 图的广度优先搜索
蛇梯棋
Snakes and Ladders
board = 6×6 蛇梯棋盘树 / 图3 个关键状态
步骤 1预建每格的 1..6 有向边。
graph ready结构化解法
预建邻接表再 BFS
时间
O(n²)空间 O(n²)先把每个格子的骰子落点和蛇梯跳转建成图,再运行标准 BFS。
1function snakesAndLadders(b) {2 const n = b.length,3 pos = s => {4 const q = Math.floor((s - 1) / n),5 r = n - 1 - q,6 c = q % 2 ? n - 1 - (s - 1) % n : (s - 1) % n;7 return [r, c]8 },9 g = Array.from({10 length: n * n + 111 }, () => []);12 for (let s = 1; s < n * n; s++)13 for (let x = s + 1; x <= Math.min(s + 6, n * n); x++) {14 const [r, c] = pos(x);15 g[s].push(b[r][c] === -1 ? x : b[r][c])16 }17 const q = [18 [1, 0]19 ],20 seen = new Set([1]);21 while (q.length) {22 const [s, d] = q.shift();23 if (s === n * n) return d;24 for (const y of g[s])25 if (!seen.has(y)) {26 seen.add(y);27 q.push([y, d + 1])28 }29 }30 return -1;31}多语言参考
来源 · CC BY-SA 4.0 ↗Java · C++ · Go
这是一组同题正确实现,独立于上方当前动画方法;不同语言可能采用另一种正确策略。
1class Solution {2 public int snakesAndLadders(int[][] board) {3 int n = board.length;4 Deque<Integer> q = new ArrayDeque<>();5 q.offer(1);6 int m = n * n;7 boolean[] vis = new boolean[m + 1];8 vis[1] = true;9 for (int ans = 0; !q.isEmpty(); ++ans) {10 for (int k = q.size(); k > 0; --k) {11 int x = q.poll();12 if (x == m) {13 return ans;14 }15 for (int y = x + 1; y <= Math.min(x + 6, m); ++y) {16 int i = (y - 1) / n, j = (y - 1) % n;17 if (i % 2 == 1) {18 j = n - j - 1;19 }20 i = n - i - 1;21 int z = board[i][j] == -1 ? y : board[i][j];22 if (!vis[z]) {23 vis[z] = true;24 q.offer(z);25 }26 }27 }28 }29 return -1;30 }31}交互式算法学习
从执行步骤真正理解 LeetCode 经典 150
本站整理 150 道高频算法面试题和 302 种解法。动画方法同步展示 JavaScript 与 Python;每题另提供 Java、C++ 与 Go 同题参考实现。
AlgoViz Lab
蛇梯棋 · 解法对比
求从 1 到 n² 的最少掷骰次数。
- 测试用例
board = 6×6 蛇梯棋盘- 题目分类
- 图的广度优先搜索
- 解法对比
- 2
BFS 状态搜索
格子是图节点,每次可走 1..6;蛇梯落点作为实际邻居。
- 时间
O(n²)- 空间
O(n²)
预建邻接表再 BFS
先把每个格子的骰子落点和蛇梯跳转建成图,再运行标准 BFS。
- 时间
O(n²)- 空间
O(n²)