LeetCode 5073. 进击的骑士(Java)BFS
题目: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的更多相关文章
- Leetcode之广度优先搜索(BFS)专题-详解429. N叉树的层序遍历(N-ary Tree Level Order Traversal)
Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary Tree Level Order Traversal) 给定一个 N 叉树,返回其节点值的层序遍历. (即从左到右 ...
- 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 + ...
- 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 ...
- LeetCode第[46]题(Java):Permutations(求所有全排列) 含扩展——第[47]题Permutations 2
题目:求所有全排列 难度:Medium 题目内容: Given a collection of distinct integers, return all possible permutations. ...
- 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 ...
- Leetcode之广度优先搜索(BFS)专题-773. 滑动谜题(Sliding Puzzle)
Leetcode之广度优先搜索(BFS)专题-773. 滑动谜题(Sliding Puzzle) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary ...
- Leetcode之广度优先搜索(BFS)专题-127. 单词接龙(Word Ladder)
Leetcode之广度优先搜索(BFS)专题-127. 单词接龙(Word Ladder) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary Tre ...
- Leetcode之广度优先搜索(BFS)专题-752. 打开转盘锁(Open the Lock)
Leetcode之广度优先搜索(BFS)专题-752. 打开转盘锁(Open the Lock) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary ...
- Leetcode之广度优先搜索(BFS)专题-1162. 地图分析(As Far from Land as Possible)
Leetcode之广度优先搜索(BFS)专题-1162. 地图分析(As Far from Land as Possible) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. ...
随机推荐
- shell 获取字符串的长度
awk 方式 bogon:conf macname$ echo "abcde" | awk '{print length($0)}' 利用${#str}来获取字符串的长度 bogo ...
- SpringSecurity匿名用户访问权限
在SpringSecurity中定义一个匿名访问权限,实现未登录用户可以访问默写页面 <http use-expressions="false" entry-point-re ...
- linux下安装 ping 命令
使用docker仓库下载的ubuntu 14.04 镜像.里面精简的连 ping 命令都没有.google 百度都搜索不到ping 命令在哪个包里. 努力找了半天,在一篇文章的字里行间发现了 ping ...
- Java 整数间的除法运算如何保留所有小数位?
1.情景展示 double d = 1/10; System.out.println(d); 返回的结果居然是0.0!这是怎么回事儿? 2.原因分析 第一步:你会发现用运算结果也可以用int类型接 ...
- Cesium 1.54评测 【转】
重要功能评测 3dtiles数据上画线和贴纹理 3dtiles数据上画线和贴纹理 把线条贴到3dtiles上需要用到两个属性:clampToGround和classificationType. c ...
- Emotion Recognition Using Graph Convolutional Networks
Emotion Recognition Using Graph Convolutional Networks 2019-10-22 09:26:56 This blog is from: https: ...
- sshfs+overlayfs实现一个共享只读资源被多个主机挂载成可写目录
sshfs+overlayfs实现一个共享只读资源被多个主机挂载成可写目录 1.sshfs -o ssh_command='sshpass -p '"${passwd}"' ssh ...
- CentOS7 增加回环地址
添加回环地址的命令和说明如下: #添加一个回环地址到lo网卡,添加多个可以改lo:后边的序号 [要添加的地址] netmask 255.255.255.255 broadcast [要添加的地址] # ...
- jcenter下载不了时,用国内镜像下载解决
修改build.gradle,以下是原本的配置信息 buildscript { repositories { google() jcenter() } dependencies { classpath ...
- [转]iview render函数常用总结(vue render函数)
原文地址:https://blog.csdn.net/weixin_43206949/article/details/89385550 iview 的render函数就是vue的render函数ivi ...