https://coderun.yandex.ru/problem/two-horses/description Легкая

Решение

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()
}