加载中...
909-蛇梯棋(Snakes and Ladders)
发表于:2021-12-03 | 分类: 中等
字数统计: 1.7k | 阅读时长: 8分钟 | 阅读量:

原文链接: https://leetcode-cn.com/problems/snakes-and-ladders

英文原文

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 is 2. You follow the ladder to square 3, but do not follow the subsequent ladder to 4.

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 and n2 do not have any ladders or snakes.

中文题目

给你一个大小为 n x n 的整数矩阵 board ,方格按从 1n2 编号,编号遵循 转行交替方式 从左下角开始 (即,从 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> 。&nbsp;</li>
    <li>当玩家到达编号 <code>n<sup>2</sup></code> 的方格时,游戏结束。</li>
    

rc 列的棋盘,按前述方法编号,棋盘格中可能存在 “蛇” 或 “梯子”;如果 board[r][c] != -1,那个蛇或梯子的目的地将会是 board[r][c]。编号为 1n2 的方格上没有蛇或梯子。

注意,玩家在每回合的前进过程中最多只能爬过蛇或梯子一次:就算目的地是另一条蛇或梯子的起点,玩家也 不能 继续移动。

  • 举个例子,假设棋盘是 [[-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]
  • 编号为 1n2 的方格上没有蛇或梯子

通过代码

高赞题解

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%

提交历史

提交时间 提交结果 执行时间 内存消耗 语言
上一篇:
908-最小差值 I(Smallest Range I)
下一篇:
910-最小差值 II(Smallest Range II)
本文目录
本文目录