1. 蛇梯棋 难度[中等]

N x N 的棋盘 board 上,按从 1 到 N*N 的数字给方格编号,编号 从左下角开始,每一行交替方向。

例如,一块 6 x 6 大小的棋盘,编号如下:

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

玩家从棋盘上的方格 1 (总是在最后一行、第一列)开始出发。

每一回合,玩家需要从当前方格 x 开始出发,按下述要求前进:

  • 选定目标方格:选择从编号 x+1,x+2,x+3,x+4,x+5,或者 x+6 的方格中选出一个目标方格 s ,目标方格的编号 <= N*N。

    • 该选择模拟了掷骰子的情景,无论棋盘大小如何,你的目的地范围也只能处于区间 [x+1, x+6] 之间。
  • 传送玩家:如果目标方格 S 处存在蛇或梯子,那么玩家会传送到蛇或梯子的目的地。否则,玩家传送到目标方格 S。

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

返回达到方格 N*N 所需的最少移动次数,如果不可能,则返回 -1。

示例:

输入:[
[-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 行,第 5 列],必须爬过蛇到方格 13。
然后你决定移动到方格 14,且必须通过梯子移动到方格 35。
然后你决定移动到方格 36, 游戏结束。
可以证明你需要至少 4 次移动才能到达第 N*N 个方格,所以答案是 4。

提示:

  • 2 <= board.length = board[0].length <= 20
  • board[i][j] 介于 1 和 N**N 之间或者等于 -1。*
  • 编号为 1 的方格上没有蛇或梯子。
  • *编号为 N**N 的方格上没有蛇或梯子。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/snakes-and-ladders
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


解法:BFS

class Solution {int n ;//一维存储数组int []nums;public int snakesAndLadders(int[][] board) {n = board.length;//如果目标不是 -1 说明永远会跳转到其他地方,无法达到目的地点 返回-1;if(board[0][0]!=-1) return -1;nums= new int[n*n+1];//用来遍历蛇形二维矩阵,判断当前行是向右还是向左增加boolean isRight =true;int idx=1;//将二维矩阵转换为一维数组for(int i=n-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<>();//<当前值,当前step>Map<Integer,Integer> map = new HashMap<>();d.addLast(1);map.put(1,0);while (!d.isEmpty()){int poll = d.pollFirst();int step = map.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(map.containsKey(np)) continue;d.addLast(np);map.put(np,step+1);}}return -1;}
}

参考


此文章创于本人学习时的记录,如有错误或更优解还请指出

21-6-27 蛇梯棋相关推荐

  1. LeetCode 815. 公交路线 / 909. 蛇梯棋(还是bfs)/ 168. Excel表列名称 / 171. Excel表列序号

    815. 公交路线 2021.6.28 每日一题 题目描述 给你一个数组 routes ,表示一系列公交线路,其中每个 routes[i] 表示一条公交线路,第 i 辆公交车将会在上面循环行驶.例如, ...

  2. leetcode —— 909. 蛇梯棋

    在一块 N x N 的棋盘 board 上,从棋盘的左下角开始,每一行交替方向,按从 1 到 N*N 的数字给方格编号.例如,对于一块 6 x 6 大小的棋盘,可以编号如下: 来源:力扣(LeetCo ...

  3. 909. 蛇梯棋-广度优先遍历

    909. 蛇梯棋-广度优先遍历 给你一个大小为 n x n 的整数矩阵 board ,方格按从 1 到 n2 编号,编号遵循 转行交替方式 ,从左下角开始 (即,从 board[n - 1][0] 开 ...

  4. LeetCode——909. 蛇梯棋(Snakes and Ladders)[中等]——分析及代码(Java)

    LeetCode--909. 蛇梯棋[Snakes and Ladders][中等]--分析及代码[Java] 一.题目 二.分析及代码 1. 广度优先搜索 (1)思路 (2)代码 (3)结果 三.其 ...

  5. leetcode 909. 蛇梯棋

    题目 N x N 的棋盘 board 上,按从 1 到 N*N 的数字给方格编号,编号 从左下角开始,每一行交替方向. 例如,一块 6 x 6 大小的棋盘,编号如下: r 行 c 列的棋盘,按前述方法 ...

  6. LeetCode 909. 蛇梯棋(BFS)

    文章目录 1. 题目 2. 解题 1. 题目 N x N 的棋盘 board 上,按从 1 到 N*N 的数字给方格编号,编号 从左下角开始,每一行交替方向. 例如,一块 6 x 6 大小的棋盘,编号 ...

  7. JAVA程序设计:蛇梯棋(LeetCode:909)

    在一块 N x N 的棋盘 board 上,从棋盘的左下角开始,每一行交替方向,按从 1 到 N*N 的数字给方格编号.例如,对于一块 6 x 6 大小的棋盘,可以编号如下: 玩家从棋盘上的方格 1 ...

  8. 每日一题 LeetCode909. 蛇梯棋 java题解

    题目 https://leetcode-cn.com/problems/snakes-and-ladders/ 代码 class Solution {int N;public int snakesAn ...

  9. ##(两个井号)和#(一个井号)都是什么意思C and C++ 2008-09-23 21:18:27 阅读1106 评论0 字号:大中小 订阅 .

    ##(两个井号)和#(一个井号)都是什么意思 C and C++ 2008-09-23 21:18:27 阅读1106 评论0   字号:大中小 订阅 连接符 ##(两个井号) 不知道什么符 #(一个 ...

最新文章

  1. element-ui中table表头错位问题
  2. [Andriod官方训练教程]保存数据之保存键-值对的集合
  3. javascript面试题以及对所涉及到的知识点的总结
  4. 数据库开发 - 事务 死锁分析与解决
  5. ubuntu15.04安装wps-office的64位版
  6. 帆软高级函数应用之层次坐标函数
  7. django的orm获取字段去重值
  8. Php生成图片的大小单位是cm,php生成图片缩略图代码类
  9. CCF计算机职业资格认证考试201312-2试题及答案
  10. 江苏高考可以用计算机嘛,2018江苏高考计算机网上评卷考生作答须知
  11. (转载)多少年来心血的结晶
  12. 计算机64位只有2g,电脑插了4G内存,但只有2G左右可以用,为什么 WIN7 64位
  13. 三防手持平板电脑在工业的发展趋势
  14. C99标准里的inttypes.h头文件
  15. Python案例:围棋的状态数
  16. Struts2学习之------Struts2的详细的复习讲解
  17. Acwing - 算法基础课 - 笔记(图论 · 三)
  18. 耐高压达林顿输出光耦(TLP127,TLP187,TLP627)功能介绍及应用实例
  19. 从贵州茅台上市的第一天起,每天买一手茅台能够盈利多少?-利用python进行茅台股票数据分析
  20. 深度神经网络(DNN)的反向传播算法总结与图解

热门文章

  1. Java 文本检索神器 “正则表达式”
  2. 微信公众号调用接口显示的错误码含义
  3. C#基础之基础语法(一)
  4. 微信分享网页链接不显示小图标怎么办
  5. PPT制作——快捷键
  6. 微信相关-微信小程序支付的实现(详细的一批版)
  7. Intel SGX 入坑(0x200f)
  8. Win11字体显示乱码的解决方法
  9. 数三角形 (组合数学+分类讨论)
  10. JavaScript div 随着鼠标移动而移动