Algorithms first

蛇梯棋 · 交互式算法学习

求从 1 到 n² 的最少掷骰次数。

#909 · 图的广度优先搜索

蛇梯棋

Snakes and Ladders

测试用例board = 6×6 蛇梯棋盘
树 / 图3 个关键状态
步骤 1预建每格的 1..6 有向边。graph ready
123456789
结构化解法

预建邻接表再 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}
多语言参考

Java · C++ · Go

来源 · CC BY-SA 4.0 ↗

这是一组同题正确实现,独立于上方当前动画方法;不同语言可能采用另一种正确策略。

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 同题参考实现。

多形态可视化数组、矩阵、DP 表、递归树、树图、链表、栈队列堆、区间和状态机按解法选择。
动画与代码同步当前状态、步骤说明、变量和代码高亮保持一一对应,可逐步播放和回退。
适合面试复习每种方案都给出思路、时间复杂度、空间复杂度、测试用例和 LeetCode 中文原题入口。
AlgoViz Lab

蛇梯棋 · 解法对比

求从 1 到 n² 的最少掷骰次数。

测试用例
board = 6×6 蛇梯棋盘
题目分类
图的广度优先搜索
解法对比
2
方案 1

BFS 状态搜索

格子是图节点,每次可走 1..6;蛇梯落点作为实际邻居。

时间
O(n²)
空间
O(n²)
方案 2

预建邻接表再 BFS

先把每个格子的骰子落点和蛇梯跳转建成图,再运行标准 BFS。

时间
O(n²)
空间
O(n²)