TGViewer
JavaScript | LeetCode JavaScript | LeetCode @easy_frontend_task · 8.31K subscribers
Post #2120 593
Задача: 1197. Minimum Knight Moves
Сложность: medium

На бесконечной шахматной доске с координатами от -бесконечности до +бесконечности у вас есть конь на клетке [0, 0].
У коня есть 8 возможных ходов. Каждый ход представляет собой два квадрата в кардинальном направлении, затем один квадрат в ортогональном направлении.

Верните минимальное количество шагов, необходимых для перемещения коня на клетку [x, y]. Гарантируется, что ответ существует.

Пример:
Input: x = 5, y = 5
Output: 4
Explanation: [0, 0] → [2, 1] → [4, 2] → [3, 4] → [5, 5]


👨‍💻 Алгоритм:

1⃣Инициализация структур данных:
Инициализируйте две очереди для хранения координат и расстояний: одну для движения от начальной точки, другую — от конечной точки.
Инициализируйте две карты для хранения посещенных координат и расстояний: одну для движения от начальной точки, другую — от конечной точки.

2⃣Реализация двунаправленного поиска в ширину (BFS):
Выполняйте шаги из очередей, расширяя круги поиска как от начальной, так и от конечной точки.
Если круги пересекаются, возвращайте сумму расстояний до точки пересечения.

3⃣Расширение кругов поиска:
Для каждой текущей точки из очередей расширяйте круг поиска по всем возможным ходам коня.
Обновляйте расстояния и добавляйте новые точки в очереди, если они еще не были посещены.
Увеличивайте units на значение, извлеченное из кучи.

😎 Решение:
class Solution {
minKnightMoves(x, y) {
const offsets = [
[1, 2], [2, 1], [2, -1], [1, -2],
[-1, -2], [-2, -1], [-2, 1], [-1, 2]
];

const originQueue = [[0, 0, 0]];
const originDistance = { '0,0': 0 };

const targetQueue = [[x, y, 0]];
const targetDistance = { [`${x},${y}`]: 0 };

while (true) {
const [ox, oy, od] = originQueue.shift();
const originKey = `${ox},${oy}`;
if (originKey in targetDistance) {
return od + targetDistance[originKey];
}

const [tx, ty, td] = targetQueue.shift();
const targetKey = `${tx},${ty}`;
if (targetKey in originDistance) {
return td + originDistance[targetKey];
}

for (const [dx, dy] of offsets) {
const nextOrigin = [ox + dx, oy + dy, od + 1];
const nextOriginKey = `${nextOrigin[0]},${nextOrigin[1]}`;
if (!(nextOriginKey in originDistance)) {
originQueue.push(nextOrigin);
originDistance[nextOriginKey] = nextOrigin[2];
}

const nextTarget = [tx + dx, ty + dy, td + 1];
const nextTargetKey = `${nextTarget[0]},${nextTarget[1]}`;
if (!(nextTargetKey in targetDistance)) {
targetQueue.push(nextTarget);
targetDistance[nextTargetKey] = nextTarget[2];
}
}
}
}
}


Ставь 👍 и забирай 📚 Базу знаний
  • 👍 1
More from @easy_frontend_task
  1. Oct 12, 2026Post #2573
  2. Oct 11, 2026Задача: 651. 4 Keys Keyboard Сложность: medium Представьте, что у вас есть специальная кла…
  3. Oct 9, 2026Задача: 1054. Distant Barcodes Сложность: medium На складе имеется ряд штрих-кодов, где i-…
  4. Oct 9, 2026Задача: 1237. Find Positive Integer Solution for a Given Equation Сложность: medium Если д…
  5. Oct 8, 2026Задача: №19. Remove Nth Node From End of List Сложность: medium Дан связанный список и чис…
  6. Oct 7, 2026Задача: 1057. Campus Bikes Сложность: medium В городке, изображенном на плоскости X-Y, ест…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →