TGViewer
Kotlin | LeetCode Kotlin | LeetCode @easy_kotlin_task · 1.7K subscribers
Post #1559 142
Задача: 1263. Minimum Moves to Move a Box to Their Target Location
Сложность: hard

Кладовщик - это игра, в которой игрок перемещает коробки по складу, пытаясь доставить их в целевые места. Игра представлена сеткой символов m x n, где каждый элемент - это стена, пол или коробка. Ваша задача - переместить коробку "B" в целевую позицию "T" по следующим правилам: символ "S" представляет игрока. Игрок может перемещаться вверх, вниз, влево, вправо по сетке, если это пол (пустая клетка). Символ '.' обозначает пол, что означает свободную клетку для ходьбы. Символ '#' обозначает стену, что означает препятствие (туда невозможно пройти). В сетке есть только одна коробка 'B' и одна целевая клетка 'T'. Коробку можно переместить на соседнюю свободную клетку, стоя рядом с коробкой, а затем двигаясь в направлении коробки. Это толчок. Игрок не может пройти через коробку. Верните минимальное количество толчков, чтобы переместить коробку к цели. Если нет возможности добраться до цели, верните -1.

Пример:
Input: grid = [["#","#","#","#","#","#"],
["#","T","#","#","#","#"],
["#",".",".","B",".","#"],
["#",".","#","#",".","#"],
["#",".",".",".","S","#"],
["#","#","#","#","#","#"]]
Output: 3


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

1⃣Выполните поиск в ширину (BFS) для всех возможных позиций игрока и коробки, отслеживая количество толчков.

2⃣Используйте очередь для хранения состояний игрока и коробки, а также текущего количества толчков.

3⃣Для каждого состояния проверяйте все возможные движения игрока и перемещения коробки, обновляйте очередь и отмечайте посещенные состояния.

😎 Решение:
class Solution {
fun minPushBox(grid: Array<CharArray>): Int {
val m = grid.size
val n = grid[0].size
val directions = arrayOf(intArrayOf(-1, 0), intArrayOf(1, 0), intArrayOf(0, -1), intArrayOf(0, 1))

fun isValid(x: Int, y: Int) = x in 0 until m && y in 0 until n && grid[x][y] != '#'

var player = intArrayOf(0, 0)
var box = intArrayOf(0, 0)
var target = intArrayOf(0, 0)

for (i in 0 until m) {
for (j in 0 until n) {
when (grid[i][j]) {
'S' -> player = intArrayOf(i, j)
'B' -> box = intArrayOf(i, j)
'T' -> target = intArrayOf(i, j)
}
}
}

val queue = ArrayDeque<IntArray>()
val visited = mutableSetOf<String>()

queue.addLast(intArrayOf(player[0], player[1], box[0], box[1], 0))
visited.add("${player[0]},${player[1]},${box[0]},${box[1]}")

while (queue.isNotEmpty()) {
val (px, py, bx, by, pushes) = queue.removeFirst()
if (bx == target[0] && by == target[1]) {
return pushes
}
for ((dx, dy) in directions) {
val npx = px + dx
val npy = py + dy
if (isValid(npx, npy)) {
if (npx == bx && npy == by) {
val nbx = bx + dx
val nby = by + dy
if (isValid(nbx, nby) && visited.add("$npx,$npy,$nbx,$nby")) {
queue.addLast(intArrayOf(npx, npy, nbx, nby, pushes + 1))
}
} else if (visited.add("$npx,$npy,$bx,$by")) {
queue.addLast(intArrayOf(npx, npy, bx, by, pushes))
}
}
}
}

return -1
}
}


Ставь 👍 и забирай 📚 Базу знаний
More from @easy_kotlin_task
  1. Oct 9, 2026Задача: 1102. Path With Maximum Minimum Value Сложность: medium Дана целочисленная матрица…
  2. Oct 7, 2026Задача: 257. Binary Tree Paths Сложность: easy Дано корневое дерево, верните все пути от к…
  3. Oct 7, 2026🔥 Скрытые вакансии с удаленной работой для Android разработчика, которые нигде больше не…
  4. Oct 6, 2026Задача: 491. Non-decreasing Subsequences Сложность: medium Дан массив целых чисел nums. Ве…
  5. Oct 5, 2026Задача: 635. Design Log Storage System Сложность: medium Вам дается несколько журналов, гд…
  6. Oct 5, 2026Задача: 1209. Remove All Adjacent Duplicates in String II Сложность: medium Вам дана строк…
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 →