Решение
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
fun main() {
val reader = BufferedReader(InputStreamReader(System.`in`))
val writer = BufferedWriter(OutputStreamWriter(System.out))
val (pos1, pos2) = reader.readLine().split(" ")
val x1 = pos1[0] - 'a'
val y1 = pos1[1] - '1'
val x2 = pos2[0] - 'a'
val y2 = pos2[1] - '1'
val parity1 = (x1 + y1) % 2
val parity2 = (x2 + y2) % 2
if (parity1 != parity2) {
writer.write("-1")
} else {
val moves = arrayOf(
intArrayOf(-2, -1), intArrayOf(-2, 1),
intArrayOf(-1, -2), intArrayOf(-1, 2),
intArrayOf(1, -2), intArrayOf(1, 2),
intArrayOf(2, -1), intArrayOf(2, 1)
)
val queue = ArrayDeque<Pair<Int, Int>>()
val visited = mutableSetOf<Pair<Int, Int>>()
queue.add(Pair(x1 * 8 + y1, x2 * 8 + y2))
visited.add(Pair(x1 * 8 + y1, x2 * 8 + y2))
var steps = 0
while (queue.isNotEmpty()) {
val size = queue.size
repeat(size) {
val (posR, posG) = queue.removeFirst()
val rX = posR / 8
val rY = posR % 8
val gX = posG / 8
val gY = posG % 8
if (rX == gX && rY == gY) {
writer.write(steps.toString())
reader.close()
writer.close()
return
}
for (moveR in moves) {
val newRX = rX + moveR[0]
val newRY = rY + moveR[1]
if (newRX !in 0..7 || newRY !in 0..7) continue
for (moveG in moves) {
val newGX = gX + moveG[0]
val newGY = gY + moveG[1]
if (newGX !in 0..7 || newGY !in 0..7) continue
val newState = Pair(newRX * 8 + newRY, newGX * 8 + newGY)
if (visited.add(newState)) {
queue.add(newState)
}
}
}
}
steps++
}
}
reader.close()
writer.close()
}