[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 的话,还是挺好做的,最主要的是:

  1. 使用一个容器保存访问过的地点

  2. 数组长度需要另外声明一个变量去保存,否则可能会随着数组的变动而产生波动

    吃了两次亏后终于记得牢牢地了……

使用 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

[JavaScript 刷题] 搜索 - DFS(深度优先搜索)

[JavaScript 刷题] 搜索 - 省份数量, leetcode 547