kt: add «773. Sliding Puzzle»
URL: https://leetcode.com/problems/sliding-puzzle/ Signed-off-by: Matej Focko <me@mfocko.xyz>
This commit is contained in:
parent
6e55e96ef0
commit
7dee18a1ca
1 changed files with 63 additions and 0 deletions
63
kt/sliding-puzzle.kt
Normal file
63
kt/sliding-puzzle.kt
Normal file
|
@ -0,0 +1,63 @@
|
|||
class Solution {
|
||||
companion object {
|
||||
private val DIRECTIONS: List<List<Int>> =
|
||||
listOf(
|
||||
listOf(1, 3),
|
||||
listOf(0, 2, 4),
|
||||
listOf(1, 5),
|
||||
listOf(0, 4),
|
||||
listOf(1, 3, 5),
|
||||
listOf(2, 4),
|
||||
)
|
||||
private val TARGET: String = "123450"
|
||||
|
||||
private fun swap(
|
||||
board: String,
|
||||
i: Int,
|
||||
j: Int,
|
||||
): String {
|
||||
val cells = board.toMutableList()
|
||||
|
||||
val tmp = cells[i]
|
||||
cells[i] = cells[j]
|
||||
cells[j] = tmp
|
||||
|
||||
return cells.joinToString(separator = "")
|
||||
}
|
||||
}
|
||||
|
||||
fun slidingPuzzle(board: Array<IntArray>): Int {
|
||||
val startState =
|
||||
board.flatMap { it.asSequence() }.joinToString(separator = "") {
|
||||
it.toString()
|
||||
}
|
||||
|
||||
val seen = mutableSetOf<String>(startState)
|
||||
val queue = ArrayDeque<String>(listOf(startState))
|
||||
|
||||
var moves = 0
|
||||
while (queue.isNotEmpty()) {
|
||||
for (i in 1..queue.size) {
|
||||
val current = queue.removeFirst()
|
||||
if (current == TARGET) {
|
||||
return moves
|
||||
}
|
||||
|
||||
val zeroIdx = current.indexOf('0')
|
||||
DIRECTIONS[zeroIdx].forEach {
|
||||
val next = swap(current, zeroIdx, it)
|
||||
if (seen.contains(next)) {
|
||||
return@forEach
|
||||
}
|
||||
|
||||
seen.add(next)
|
||||
queue.addLast(next)
|
||||
}
|
||||
}
|
||||
|
||||
moves += 1
|
||||
}
|
||||
|
||||
return -1
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue