Решение
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()
}