[JavaScript 刷题] 搜索 - 进击的骑士, Leetcode 1197
Posted GoldenaArcher
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[JavaScript 刷题] 搜索 - 进击的骑士, Leetcode 1197相关的知识,希望对你有一定的参考价值。
[javascript 刷题] 搜索 - 进击的骑士, Leetcode 1197
github repo 地址: https://github.com/GoldenaArcher/js_leetcode,Github 的目录 大概 会更新的更勤快一些。
题目地址:1197. Minimum Knight Moves
题目
如下:
In an infinite chess board with coordinates from -infinity to +infinity, you have a knight at square
[0, 0]
.A knight has 8 possible moves it can make, as illustrated below. Each move is two squares in a cardinal direction, then one square in an orthogonal direction.
解题思路
国际象棋里面的马走法和中国象棋的差不多,都是 L 字形:
也就是说,每个 knight 最多能够有 8 个落点。
题目中要求就是找到抵达某个地点的最短路径,无重图+最短路径,第一个反应肯定就是 BFS 的方法去实现。
本质上来说,只要用 BFS 的话,还是挺好做的,最主要的是:
-
使用一个容器保存访问过的地点
-
数组长度需要另外声明一个变量去保存,否则可能会随着数组的变动而产生波动
吃了两次亏后终于记得牢牢地了……
使用 JavaScript 解题
/**
* @param number x
* @param number y
* @return number
*/
var minKnightMoves = function (x, y)
if (x === 0 && y === 0) return 0;
const queue = [[0, 0]];
const directions = [
[1, 2],
[-1, 2],
[1, -2],
[-1, -2],
[2, 1],
[-2, 1],
[2, -1],
[-2, -1],
];
let step = 0;
const visited = new Set("0,0");
while (queue.length > 0)
const size = queue.length;
for (let i = 0; i < size; i++)
const [r, c] = queue.shift();
const path = r + "," + c;
for (const [ri, ci] of directions)
const row = r + ri,
col = c + ci;
const currPath = row + "," + col;
if (visited.has(currPath)) continue;
if (row === x && col === y) return step + 1;
queue.push([row, col]);
visited.add(currPath);
step++;
return -1;
;
以上是关于[JavaScript 刷题] 搜索 - 进击的骑士, Leetcode 1197的主要内容,如果未能解决你的问题,请参考以下文章
[JavaScript 刷题] 搜索 - 单词搜索, leetcode 79
[JavaScript 刷题] 搜索 - 单词搜索, leetcode 79
[JavaScript 刷题] 二分搜索 - 搜索二维矩阵, leetcode 74
[JavaScript 刷题] 二分搜索 - 搜索二维矩阵, leetcode 74