https://coderun.yandex.ru/problem/checkers/description Легкая

Решение

import java.io.BufferedReader
import java.io.InputStreamReader
import java.io.BufferedWriter
import java.io.OutputStreamWriter

fun main() {
    val reader = BufferedReader(InputStreamReader(System.`in`)) // Создаём объект для чтения ввода
    val writer = BufferedWriter(OutputStreamWriter(System.out)) // Создаём объект для вывода результата

    // Читаем размеры доски N и M
    val (n, m) = reader.readLine().split(" ").map { it.toInt() }
    
    // Читаем количество белых шашек и их координаты
    val w = reader.readLine().toInt()
    val white = Array(w) { 
        reader.readLine().split(" ").map { it.toInt() }.let { it[0] to it[1] } // Сохраняем как пары (i, j)
    }
    
    // Читаем количество чёрных шашек и их координаты
    val b = reader.readLine().toInt()
    val black = Array(b) { 
        reader.readLine().split(" ").map { it.toInt() }.let { it[0] to it[1] } // Сохраняем как пары (i, j)
    }
    
    // Читаем, чей ход (white или black)
    val turn = reader.readLine()

    // Создаём доску как массив: 0 — пусто, 1 — белая шашка, 2 — чёрная шашка
    val board = Array(n + 1) { IntArray(m + 1) }
    for ((i, j) in white) board[i][j] = 1 // Помечаем белые шашки
    for ((i, j) in black) board[i][j] = 2 // Помечаем чёрные шашки

    // Возможные направления для рубки (по диагонали: вверх-лево, вверх-право, вниз-лево, вниз-право)
    val directions = listOf(-1 to -1, -1 to 1, 1 to -1, 1 to 1)
    
    // Определяем, кто ходит (player) и кто соперник (opponent)
    val (player, opponent) = if (turn == "white") 1 to 2 else 2 to 1
    
    // Выбираем шашки текущего игрока
    val positions = if (turn == "white") white else black

    // Флаг, указывающий, возможна ли рубка
    var canCapture = false
    
    // Проверяем каждую шашку игрока
    for ((i, j) in positions) {
        // Проверяем все направления
        for ((di, dj) in directions) {
            val ni = i + di // Координата соседней клетки по диагонали
            val nj = j + dj
            val jumpI = i + 2 * di // Координата клетки после прыжка
            val jumpJ = j + 2 * dj
            
            // Проверяем, что обе клетки в пределах доски
            if (ni in 1..n && nj in 1..m && jumpI in 1..n && jumpJ in 1..m) {
                // Если соседняя клетка занята шашкой соперника, а следующая свободна — можно рубить
                if (board[ni][nj] == opponent && board[jumpI][jumpJ] == 0) {
                    canCapture = true
                    break
                }
            }
        }
        if (canCapture) break // Если нашли возможность рубки, выходим из внешнего цикла
    }

    // Выводим результат: "Yes" если можно рубить, "No" если нельзя
    writer.write(if (canCapture) "Yes" else "No")
    writer.newLine()

    // Закрываем потоки ввода-вывода
    reader.close()
    writer.close()
}