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


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

每一次从方格 x 起始的移动都由以下部分组成:

你选择一个目标方块 S,它的编号是 x+1,x+2,x+3,x+4,x+5,或者 x+6,只要这个数字 <= N*N。
如果 S 有一个蛇或梯子,你就移动到那个蛇或梯子的目的地。否则,你会移动到 S。 
在 r 行 c 列上的方格里有 “蛇” 或 “梯子”;如果 board[r][c] != -1,那个蛇或梯子的目的地将会是 board[r][c]。

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

返回达到方格 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 的方格上没有蛇或梯子。

思路:蛮水的一道题,翻译硬生生的搞得谁都看不懂,害的我一个一个样例的试才彻底明白题意,其实仍旧是一个走方格问题,一开始你位于左下角,你的目标是走到n*n,倘若你当前在x,则你下一次可以移动到x+1,x+2,...,x+6的任意一个位置,并且若下一次你要移动到的位置是一个梯子的起点或者是蛇的起点,则你自动移动到梯子或者蛇的终点,并且这一次移动不算步数,但是刚才呢一步是需要算步数的,然后求一波最小步数即可。

坑点:若当前你的位置是梯子或者蛇的起点并且还没有移动,则你不能走捷径,只能掷骰子移动(1到6),若你已经走了一次捷径,则这次移动不能再走捷径了!

class Solution {class node{int x,step;public node(int x,int step) {this.x=x;this.step=step;}}int[][] a;boolean[] flag;boolean[] mark;Map<Integer,int[]> map;public int snakesAndLadders(int[][] board) {int n=board.length;a=new int[n][n];flag=new boolean[n*n+1];mark=new boolean[n*n+1];map=new HashMap<>();Queue<node> q=new LinkedList<>();int size=0;for(int i=0;i<n;i++) {if(i%2==0) {for(int j=0;j<n;j++) {a[n-1-i][j]=++size;map.put(size, new int[2]);map.get(size)[0]=n-1-i;map.get(size)[1]=j;}}else {for(int j=n-1;j>=0;j--) {a[n-1-i][j]=++size;map.put(size, new int[2]);map.get(size)[0]=n-1-i;map.get(size)[1]=j;}}}q.add(new node(1,0));flag[1]=true; mark[1]=true;while(!q.isEmpty()) {node now=q.poll();if(now.x==n*n)return now.step;for(int i=1;i<7;i++) {int x=now.x+i;if(x>n*n) break;if(flag[x]) continue;flag[x]=true;int xx=map.get(x)[0];int yy=map.get(x)[1];if(board[xx][yy]!=-1 && !mark[board[xx][yy]]) {mark[board[xx][yy]]=true;q.add(new node(board[xx][yy],now.step+1));}else if(board[xx][yy]==-1)q.add(new node(x,now.step+1));}}return -1;}
}

JAVA程序设计:蛇梯棋(LeetCode:909)相关推荐

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

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

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

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

  3. leetcode —— 909. 蛇梯棋

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

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

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

  5. 21-6-27 蛇梯棋

    蛇梯棋 难度[中等] 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. leetcode 909. 蛇梯棋

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

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

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

  9. JAVA程序设计:IPO(LeetCode:502)

    假设 力扣(LeetCode)即将开始其 IPO.为了以更高的价格将股票卖给风险投资公司,力扣 希望在 IPO 之前开展一些项目以增加其资本. 由于资源有限,它只能在 IPO 之前完成最多 k 个不同 ...

最新文章

  1. 这个插件竟打通了Python和Excel,还能自动生成代码!
  2. 网络推广策略之如何稳定新站的关键词排名?
  3. PLSQL的截取函数
  4. QT的QSGSimpleMaterialShader类的使用
  5. SpringBoot基础篇Bean之条件注入之注解使用
  6. php错误403_phpstudy访问文件报错403/Forbidden解决办法
  7. L2-001. 紧急救援-PAT团体程序设计天梯赛GPLT(Dijkstra算法)
  8. 《移动通信》学习总结
  9. VassistX的简单介绍与下载安装
  10. cdrom是什么意思_开启电脑时出现CDROM是什么意思
  11. 《D o C P》学习笔记(3 - 0)Regular Expressions, other languages and interpreters - 简介
  12. 通信设计院,到底是干啥的?
  13. python当前时间减一年_python当前时间减一年_Python 日期时间datetime 加一天,减一天,加减一小时一分钟,加减一年......
  14. 机械原理习题-(附答案)
  15. java中的高内聚和低耦合和接口的简单理解
  16. SAP_HCM_Schema_CN28_XIN0
  17. api有哪些 javasocket_Java的socket通信与操作系统的SocketAPI关系探究
  18. 航天 生物 计算机 新能源作文初一,徐杰初一(下)大小作文训练计划
  19. excel取消工作表保护,获取原始密码
  20. 5G丨柬埔寨移动运营商Smart Axiata与华为合作进行5G测试

热门文章

  1. 算法分析与设计:贪心算法实现最少硬币找钱问题(支付+找零共花费硬币数最少)
  2. 中国企业领导力培训行业市场供需与战略研究报告
  3. IDEA HTTP Client (秒懂)
  4. C++类成员函数指针使用介绍
  5. 棋盘游戏(匈牙利算法)
  6. css-doodle_如何使用CSS Doodle用CSS绘制图案
  7. CSS3霓虹灯文字特效
  8. 扶苏的bitset浅谈
  9. 逻辑航线信息学系列教程:二进制(Binary)
  10. SDOI2014 Round1 day2