题目:5073. 进击的骑士

一个坐标可以从 -infinity 延伸到 +infinity 的 无限大的 棋盘上,你的 骑士 驻扎在坐标为 [0, 0] 的方格里。

骑士的走法和中国象棋中的马相似,走 “日” 字:即先向左(或右)走 1 格,再向上(或下)走 2 格;或先向左(或右)走 2 格,再向上(或下)走 1 格。

每次移动,他都可以按图示八个方向之一前进。

现在,骑士需要前去征服坐标为 [x, y] 的部落,请你为他规划路线。

最后返回所需的最小移动次数即可。本题确保答案是一定存在的。

示例 1:
输入:x = 2, y = 1
输出:1
解释:[0, 0] → [2, 1]
示例 2:
输入:x = 5, y = 5
输出:4
解释:[0, 0] → [2, 1] → [4, 2] → [3, 4] → [5, 5]
提示:
  • |x| + |y| <= 300
题解:

比较愚笨的办法就是用 宽度优先搜索(BFS) 算法走到目标点为止。我采用的也是这种算法。至于第一名的用的算法在下实在是看不懂,姑且先放着。我在CSDN论坛发的讨论第一名写的代码的帖子

很明显,棋盘是对称的。直接将目标点坐标取绝对值,调整到第一象限或 X 轴或 Y 轴。

然后只在第一象限用BFS算得结果。

起点(0,0)是特殊点,直接返回 0。

点(1,1)也是特殊点,因为只在第一象限的话到达(1,1)至少要 4 步,但是如果可以通过其他象限的话,只需要 2 步即可到达(1,1)。

用二维数组 board[x + 3][y + 3] 表示到达点(r,c)的最少步数。

到达一个点后,如果合法,则步数等于上一个点的步数加 1。如果是目标点,直接返回步数,否则将坐标入队列。

时间复杂度: 在下无能为力

空间复杂度: 在下还是无能为力

Java:
class Solution {
public int minKnightMoves( int x,
int y) {
x = Math.abs(x);// 调整到第一象限
y = Math.abs(y); if (x + y == 0) {// 起点(0,0)
return 0;
}
if (x == 1 && y == 1) {// 此算法是无法计算点(1,1)的最少步数
return 2;
} int m = x + 3;
int n = y + 3;
int[][] board = new int[m][n]; int[] dx = { 2, 1, -1, -2, -2, -1, 1, 2 };
int[] dy = { 1, 2, 2, 1, -1, -2, -2, -1 }; Queue<int[]> queue = new LinkedList<>();
queue.add(new int[] { 0, 0 }); while (!queue.isEmpty()) {
int[] cur = queue.poll();// 出队列
for (int i = 0; i < 8; ++i) {
int r = cur[0] + dx[i];
int c = cur[1] + dy[i];
if (r < 0 || r >= m || c < 0 || c >= n) {// 越界
continue;
}
if (r + c == 0) {// 回到了起点
continue;
}
if (board[r][c] == 0) {// 未访问过当前点
board[r][c] = board[cur[0]][cur[1]] + 1;
if (r == x && c == y) {// 当前点就是目标点
return board[r][c];// 返回结果
}
queue.add(new int[] { r, c });// 不是目标点,入队列
}
}
}
return -1;
}
}

LeetCode 5073. 进击的骑士(Java)BFS的更多相关文章

  1. Leetcode之广度优先搜索(BFS)专题-详解429. N叉树的层序遍历(N-ary Tree Level Order Traversal)

    Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary Tree Level Order Traversal) 给定一个 N 叉树,返回其节点值的层序遍历. (即从左到右 ...

  2. LeetCode第[18]题(Java):4Sum 标签:Array

    题目难度:Medium 题目: Given an array S of n integers, are there elements a, b, c, and d in S such that a + ...

  3. LeetCode第[1]题(Java):Two Sum 标签:Array

    题目: Given an array of integers, return indices of the two numbers such that they add up to a specifi ...

  4. LeetCode第[46]题(Java):Permutations(求所有全排列) 含扩展——第[47]题Permutations 2

    题目:求所有全排列 难度:Medium 题目内容: Given a collection of distinct integers, return all possible permutations. ...

  5. LeetCode第[1]题(Java):Two Sum (俩数和为目标数的下标)——EASY

    题目: Given an array of integers, return indices of the two numbers such that they add up to a specifi ...

  6. Leetcode之广度优先搜索(BFS)专题-773. 滑动谜题(Sliding Puzzle)

    Leetcode之广度优先搜索(BFS)专题-773. 滑动谜题(Sliding Puzzle) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary ...

  7. Leetcode之广度优先搜索(BFS)专题-127. 单词接龙(Word Ladder)

    Leetcode之广度优先搜索(BFS)专题-127. 单词接龙(Word Ladder) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary Tre ...

  8. Leetcode之广度优先搜索(BFS)专题-752. 打开转盘锁(Open the Lock)

    Leetcode之广度优先搜索(BFS)专题-752. 打开转盘锁(Open the Lock) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary ...

  9. Leetcode之广度优先搜索(BFS)专题-1162. 地图分析(As Far from Land as Possible)

    Leetcode之广度优先搜索(BFS)专题-1162. 地图分析(As Far from Land as Possible) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. ...

随机推荐

  1. ent 基本使用八 索引

    我们可以在ent 的schema 中定义index 可以方便的控制数据约束,使用索引可以加速我们的访问以及数据的唯一性处理 配置字段索引 多字段索引 package schema ​ import ( ...

  2. Java程序设计学习知识点总结

    Java程序设计学习知识点总结 Java语言简单,面向对象,分布式,解释性,健壮,安全与系统无关,可移植,高性能,多线程,动态语言. 什么是框架 可以认为是某种应用的半成品,就是一组组件用来完善自己的 ...

  3. Missing Data Reconstruction in Remote Sensing Image With a Unified Spatial–Temporal–Spectral Deep Convolutional Neural Network(缺失数据补全,时空谱网络)

    摘要 文章针对修复坏波段(AQUA B6),恢复条带损失,恢复云污染提出了一个深度学习网络结构,他说 To date, to the best of our knowledge, no studies ...

  4. WSL调用Windows下的ParaView对OpenFOAM进行后处理

    OpenFOAM可以在windows下的Linux子系统(WSL)安装,但是很麻烦的一个问题是WSL没有图形化的界面,只有一个控制台窗口,在后处理的过程中我们就没有办法直接调用paraFoam命令启动 ...

  5. js正则表达式之解决html解析<>标签问题

    应用场景:以博客写文章为例,有的时候我们不经意间写的字符串带标签,然后浏览器将其解析了,实际上我们并不希望其被解析,于是可通过核心代码解决该问题. 核心代码如下: data.codeSource.re ...

  6. 解决vue项目路由出现message: "Navigating to current location (XXX) is not allowed"的问题(点击多次跳转)

    如果网页跳转用的方法传参去跳转: (点击多次链接会出现错误) <a class="" href="javascript:void(0);" @click= ...

  7. SpringBoot——配置文件占位符

    在配置文件中采用: ${random.int} 获取一个随机值.

  8. OSS利用ossutil64上传文件

     ossutil64下载地址: http://gosspublic.alicdn.com/ossutil/1.6.0/ossutil64?spm=a2c4g.11186623.2.12.3638159 ...

  9. asp.netcore 高并发下使用HttpClient的方法

    大家都知道,使用HttpClient,在并发量不大的情况,一般没有任何问题:但是在并发量一上去,如果使用不当,会造成很严重的堵塞的情况. 解决方案如下: 一.可以参考微软官方提供的方法:https:/ ...

  10. JS 生成随机字符串 随机颜色

    使用Math.random()生成随机数 0.7489584611780002数字的.toString(n) 将数字转换为 n 进制的字符串 n取值范围(0~36)"0.vbpjw8lipf ...