英文原文
You are given an n x n
integer matrix board
where the cells are labeled from 1
to n2
in a Boustrophedon style starting from the bottom left of the board (i.e. board[n - 1][0]
) and alternating direction each row.
You start on square 1
of the board. In each move, starting from square curr
, do the following:
- Choose a destination square
next
with a label in the range[curr + 1, min(curr + 6, n2)]
.<ul> <li>This choice simulates the result of a standard <strong>6-sided die roll</strong>: i.e., there are always at most 6 destinations, regardless of the size of the board.</li> </ul> </li> <li>If <code>next</code> has a snake or ladder, you <strong>must</strong> move to the destination of that snake or ladder. Otherwise, you move to <code>next</code>.</li> <li>The game ends when you reach the square <code>n<sup>2</sup></code>.</li>
A board square on row r
and column c
has a snake or ladder if board[r][c] != -1
. The destination of that snake or ladder is board[r][c]
. Squares 1
and n2
do not have a snake or ladder.
Note that you only take a snake or ladder at most once per move. If the destination to a snake or ladder is the start of another snake or ladder, you do not follow the subsequent snake or ladder.
- For example, suppose the board is
[[-1,4],[-1,3]]
, and on the first move, your destination square is2
. You follow the ladder to square3
, but do not follow the subsequent ladder to4
.
Return the least number of moves required to reach the square n2
. If it is not possible to reach the square, return -1
.
Example 1:
Input: board = [[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,35,-1,-1,13,-1],[-1,-1,-1,-1,-1,-1],[-1,15,-1,-1,-1,-1]] Output: 4 Explanation: In the beginning, you start at square 1 (at row 5, column 0). You decide to move to square 2 and must take the ladder to square 15. You then decide to move to square 17 and must take the snake to square 13. You then decide to move to square 14 and must take the ladder to square 35. You then decide to move to square 36, ending the game. This is the lowest possible number of moves to reach the last square, so return 4.
Example 2:
Input: board = [[-1,-1],[-1,3]] Output: 1
Constraints:
n == board.length == board[i].length
2 <= n <= 20
grid[i][j]
is either-1
or in the range[1, n2]
.- The squares labeled
1
andn2
do not have any ladders or snakes.
中文题目
给你一个大小为 n x n
的整数矩阵 board
,方格按从 1
到 n2
编号,编号遵循 转行交替方式 ,从左下角开始 (即,从 board[n - 1][0]
开始)每一行交替方向。
玩家从棋盘上的方格 1
(总是在最后一行、第一列)开始出发。
每一回合,玩家需要从当前方格 curr
开始出发,按下述要求前进:
- 选定目标方格
next
,目标方格的编号符合范围[curr + 1, min(curr + 6, n2)]
。<ul> <li>该选择模拟了掷 <strong>六面体骰子</strong> 的情景,无论棋盘大小如何,玩家最多只能有 6 个目的地。</li> </ul> </li> <li>传送玩家:如果目标方格 <code>next</code> 处存在蛇或梯子,那么玩家会传送到蛇或梯子的目的地。否则,玩家传送到目标方格 <code>next</code> 。 </li> <li>当玩家到达编号 <code>n<sup>2</sup></code> 的方格时,游戏结束。</li>
r
行 c
列的棋盘,按前述方法编号,棋盘格中可能存在 “蛇” 或 “梯子”;如果 board[r][c] != -1
,那个蛇或梯子的目的地将会是 board[r][c]
。编号为 1
和 n2
的方格上没有蛇或梯子。
注意,玩家在每回合的前进过程中最多只能爬过蛇或梯子一次:就算目的地是另一条蛇或梯子的起点,玩家也 不能 继续移动。
- 举个例子,假设棋盘是
[[-1,4],[-1,3]]
,第一次移动,玩家的目标方格是2
。那么这个玩家将会顺着梯子到达方格3
,但 不能 顺着方格3
上的梯子前往方格4
。
返回达到编号为 n2
的方格所需的最少移动次数,如果不可能,则返回 -1
。
示例 1:
输入:board = [[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,35,-1,-1,13,-1],[-1,-1,-1,-1,-1,-1],[-1,15,-1,-1,-1,-1]] 输出:4 解释: 首先,从方格 1 [第 5 行,第 0 列] 开始。 先决定移动到方格 2 ,并必须爬过梯子移动到到方格 15 。 然后决定移动到方格 17 [第 3 行,第 4 列],必须爬过蛇到方格 13 。 接着决定移动到方格 14 ,且必须通过梯子移动到方格 35 。 最后决定移动到方格 36 , 游戏结束。 可以证明需要至少 4 次移动才能到达最后一个方格,所以答案是 4 。
示例 2:
输入:board = [[-1,-1],[-1,3]] 输出:1
提示:
n == board.length == board[i].length
2 <= n <= 20
grid[i][j]
的值是-1
或在范围[1, n2]
内- 编号为
1
和n2
的方格上没有蛇或梯子
通过代码
高赞题解
BFS
最多有 $20 * 20$ 个格子,直接使用常规的单向 BFS
进行求解即可。
为了方便我们可以按照题目给定的意思,将二维的矩阵「扁平化」为一维的矩阵,然后再按照规则进行 BFS
。
代码:
class Solution {
int n;
int[] nums;
public int snakesAndLadders(int[][] board) {
n = board.length;
if (board[0][0] != -1) return -1;
nums = new int[n * n + 1];
boolean isRight = true;
for (int i = n - 1, idx = 1; i >= 0; i--) {
for (int j = (isRight ? 0 : n - 1); isRight ? j < n : j >= 0; j += isRight ? 1 : -1) {
nums[idx++] = board[i][j];
}
isRight = !isRight;
}
int ans = bfs();
return ans;
}
int bfs() {
Deque<Integer> d = new ArrayDeque<>();
Map<Integer, Integer> m = new HashMap<>();
d.addLast(1);
m.put(1, 0);
while (!d.isEmpty()) {
int poll = d.pollFirst();
int step = m.get(poll);
if (poll == n * n) return step;
for (int i = 1; i <= 6; i++) {
int np = poll + i;
if (np <= 0 || np > n * n) continue;
if (nums[np] != -1) np = nums[np];
if (m.containsKey(np)) continue;
m.put(np, step + 1);
d.addLast(np);
}
}
return -1;
}
}
- 时间复杂度:$O(n^2)$
- 空间复杂度:$O(n^2)$
其他「图论 BFS」的内容
题目 | 题解 | 难度 | 推荐指数 |
---|---|---|---|
127. 单词接龙 | LeetCode 题解链接 | 困难 | 🤩🤩🤩🤩🤩 |
403. 青蛙过河 | LeetCode 题解链接 | 困难 | 🤩🤩🤩🤩🤩 |
752. 打开转盘锁 | LeetCode 题解链接 | 中等 | 🤩🤩🤩🤩 |
773. 滑动谜题 | LeetCode 题解链接 | 困难 | 🤩🤩🤩🤩 |
统计信息
通过次数 | 提交次数 | AC比率 |
---|---|---|
16453 | 35803 | 46.0% |
提交历史
提交时间 | 提交结果 | 执行时间 | 内存消耗 | 语言 |
---|