文章目录

  • 题解分析
  • java-queue
  • map-containsKey()
  • map-put()
  • map-get()

题解分析

给定骑士在棋盘上的 初始 位置(一个2进制矩阵 0 表示空 1 表示有障碍物),找到到达 终点 的最短路线,返回路线的长度。如果骑士不能到达则返回 -1 。
https://www.jiuzhang.com/solution/knight-shortest-path/?utm_source=sc-zhihuzl-lm

起点跟终点必定为空.
骑士不能碰到障碍物.
路径长度指骑士走的步数.

样例
例1:

输入:

[[0,0,0],[0,0,0],[0,0,0]]
source = [2, 0] destination = [2, 2]

输出: 2
解释:
[2,0]->[0,1]->[2,2]

如果骑士的位置为 (x,y),他下一步可以到达以下这些位置:

(x + 1, y + 2)
(x + 1, y - 2)
(x - 1, y + 2)
(x - 1, y - 2)
(x + 2, y + 1)
(x + 2, y - 1)
(x - 2, y + 1)
(x - 2, y - 1)
/*** Definition for a point.* class Point {*     int x;*     int y;*     Point() { x = 0; y = 0; }*     Point(int a, int b) { x = a; y = b; }* }*/public class Solution {public static final int[] dx = {1, 1, -1, -1, 2, 2, -2, -2};public static final int[] dy = {2, -2, 2, -2, 1, -1, 1, -1};/*** @param grid: a chessboard included 0 (false) and 1 (true)* @param source: a point* @param destination: a point* @return: the shortest path */public int shortestPath(boolean[][] grid, Point source, Point destination) {//棋盘不存在,起点不存在if (grid == null || grid.length == 0|| grid[0] == null || grid[0].length == 0) {return -1;}Queue<Point> queue = new ArrayDeque();Map<Integer, Integer> distance = new HashMap();int n = grid.length, m = grid[0].length;queue.offer(source);distance.put(source.x * m + source.y, 0);while (!queue.isEmpty()) {Point point = queue.poll();//走完了if (point.x == destination.x && point.y == destination.y) {return distance.get(point.x * m + point.y);}//找下一个走的点坐标for (int i = 0; i < 8; i++) {int adjX = point.x + dx[i];int adjY = point.y + dy[i];//走不通if (!isValid(adjX, adjY, grid)) {continue;}//判断此处是否已经走过了if (distance.containsKey(adjX * m + adjY)) {continue;}distance.put(adjX * m + adjY, distance.get(point.x * m + point.y) + 1);//走的格子坐标入队queue.offer(new Point(adjX, adjY));}}return -1;}//是否走的通private boolean isValid(int x, int y, boolean[][] grid) {if (x < 0 || x >= grid.length || y < 0 || y >= grid[0].length) {return false;}return !grid[x][y];}
}

java-queue

boolean  add(E e) //将指定的元素插入此队列(如果立即可行且不会违反容量限制),在成功时返回 true,如果当前没有可用的空间,则抛出 IllegalStateException。
E        element() //获取,但是不移除此队列的头。
boolean  offer(E e) //将指定的元素插入此队列(如果立即可行且不会违反容量限制),当使用有容量限制的队列时,此方法通常要优于 add(E),后者可能无法插入元素,而只是抛出一个异常。
E        peek() //获取但不移除此队列的头;如果此队列为空,则返回 null。
E        poll() //获取并移除此队列的头,如果此队列为空,则返回 null。
E        remove() //获取并移除此队列的头。

map-containsKey()

1 map是一个key和value的键值对的集合。有key和value键值对,就会有判断是否有key。这方法就是containsKey方法。

if(map.containsKey("name")){value=map.get("name").toString();
System.out.println("找到了name的值:"+value);
}

map-put()

put(K key, V value)
key - 与指定值相关联的键。
value - 与指定键关联的值。

返回值:当存在这个key的时候,会覆盖掉原来的value并返回oldvalue,也就是旧值。
对返回值的进一步解释:
如果没有键映射,则返回NULL。
该函数返回与指定键关联的旧值。
这个操作不管啥条件都会覆盖旧的。

map-get()

get(key):
Key - 其关联值将被返回的键。
返回值:指定键映射到的值,如果此映射不包含键的映射,则为NULL。

返回值进一步阐述:
使用get函数,那么应该有先调用put函数对m表进行存储,不然肯定是返回null;
由于m表的存储跟put函数有关,在实际工程应用中get返回值是受到put函数影响的。

https://www.cnblogs.com/rogerelva55/p/shunxin.html

九章算法 | 骑士的最短路线-BFS相关推荐

  1. 九章算法笔记 - 思路总结

    上九章算法课的笔记,之前记在笔记本上,现在扫描出来便于保存,每次面试之前看着这个笔记过一遍,心里有谱一些. 目录: 1.二分搜索 Binary search 2.二叉树与分治法 3.宽度优先搜索 BF ...

  2. 九章算法高频算法题 题解

    专栏 | 九章算法 网址 | http://www.jiuzhang.com Google 面试题: Google 面试题 | 目标和 Google 面试题 | 建邮局 Google 面试题 | 0与 ...

  3. 九章算法【总结】Java 搞定链表-面试常考题目精选

    面试大总结之链表 CS3K.com 一.OverView: 链表是面试中常考的,本文参考了其它一些文章,加上小编的自己总结,基本每个算法都测试并优化过. 算法大全(1)单链表 中还有一些链表题目,将来 ...

  4. 分治习题--九章算法培训课第三章笔记

    1.Maximum Depth of Binary Tree 这是道简单的分治习题了 分: 左子树最大深度 右子树最大深度 治: 最大深度等于max(左子树,右子树)+1 public class S ...

  5. 动态规划法求最大字段和时间复杂度_九章算法 | 动态规划:最长上升子序列

    给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度. 在线评测地址:LintCode 领扣 说明 最长上升子序列的定义: 最长上升子序列问题是在一个无序的给定序列中找到一个尽可能长的由低 ...

  6. 最长回文子串动态规划_九章算法 | 微软面试题:最长回文子串

    给出一个字符串(假设长度最长为1000),求出它的最长回文子串,你可以假定只有一个满足条件的最长回文串. 在线评测地址:LintCode 领扣 样例 1: 输入:"abcdzdcab&quo ...

  7. 编号是i的结点所在的层次号是_九章算法 | 微软面试题:二叉树的锯齿形层次遍历...

    给出一棵二叉树,返回其节点值的锯齿形层次遍历(先从左往右,下一层再从右往左,层与层之间交替进行) 在线评测地址:LintCode 领扣 样例 1: 输入:{1,2,3} 输出:[[1],[3,2]] ...

  8. 多个数字数组_九章算法 | 谷歌面试题:多个数组的交集

    给出多个数组,求它们的交集.输出他们交集的大小. 在线评测地址:LintCode 领扣 样例 1: 输入: [[1,2,3],[3,4,5],[3,9,10]]输出: 1解释:只有3出现在三个数组中. ...

  9. arrays合并两个数组_九章算法 | 字节跳动面试题:合并k个排序数组

    将 k 个有序数组合并为一个大的有序数组. 在线评测地址:LintCode 领扣 样例 1: Input: [[1, 3, 5, 7],[2, 4, 6],[0, 8, 9, 10, 11]] Out ...

最新文章

  1. MQ 消息中间件梳理
  2. 【转】SAP S4 OP/Cloud 10个区别
  3. 【内网安全】域横向smbwmi明文或hash传递
  4. 【网络流】【待补】C. Heidi and Library (hard)
  5. 造了一个 Redis 分布锁的轮子,没想到还学到这么多东西!!!
  6. map中获取数组_如何从php多维数组中获取特定的键值?
  7. DIP、IoC、DI笔记整理
  8. mfc--使用ShellExecute打开另一个可执行程序
  9. Step by Step WebMatrix网站开发之一:Webmatrix安装
  10. 用struts拦截器实现登录验证功能AuthorizationInterceptor
  11. 联想i5安装JAVA_lenovo联想G410笔记本安装系统
  12. 快速消除Word文档中空格
  13. android压力测试命令monkey详解,android压力测试命令monkey详解
  14. android 自定义锁屏
  15. 魅族mx5游戏模式小熊猫_熊猫主地图在5分钟内套用和套用
  16. 微信小程序开发技术预研分析报告
  17. 【数据分析day03】苹果股价数据分析
  18. 三菱FX3UFX2NFX1N PLC 模拟器模拟通信功能
  19. 10分钟快速学Handlebars
  20. Visual Studio2015产品密钥

热门文章

  1. js时间戳格式化成日期格式
  2. 图片预加载的问题-----有针对加载和缓存的兼容解决
  3. 解决android应用程序适用新老android系统版本方法
  4. 考研本校与外校如何选择?
  5. 转载:cin总结附带string输入总结
  6. MySQL(二)——DQL数据查询语言
  7. 李宏毅机器学习作业2:Winner还是Losser(含训练数据)
  8. C语言面向对象编程(五):单链表实现
  9. 计算机控制读书报告心得,计算机控制系统读书报告
  10. ui vue 创建项目教程 并关闭语法_使用vue ui命令创建vue项目步骤