https://coderun.yandex.ru/problem/tic-tac-toe/description Легкая

Условие

Вам дано клетчатое поле произвольного размера n × m. На этом поле Вася с Петей рисовали крестики и нолики. Они быи так увлечены рисованием, что совсем забыли правила игры. Они не следили за очередностью ходов и не проверяли, выиграли ли они. Им наскучило рисовать и они решили закончить играть.

От Вас требуется проверить, закончена ли игра на данном поле. В рамках данной задачи считается, что игрок выигрывает в крестики-нолики, если его символ встречается 5 раз подряд по вертикали, горизонтали или диагонали. Заметьте, что поскольку Вася с Петей не следили за игрой, возможна ситуация, когда они оба выиграли.

Примеры

Ввод: 2 5 XXXX. OOOOO Вывод: Yes

Ввод: 5 6 XX...O .XXXXO .....O .....O .....O Вывод: Yes

Решение

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

fun main(args: Array<String>) {
    val reader = BufferedReader(InputStreamReader(System.`in`))
    val writer = BufferedWriter(OutputStreamWriter(System.out))

    // Читаем размеры поля
    val (n, m) = reader.readLine().split(" ").map { it.toInt() }
    
    // Читаем поле
    val field = Array(n) { reader.readLine().toCharArray() }
    
    // Функция проверки последовательности из 5 символов
    fun checkWin(c: Char, i: Int, j: Int, di: Int, dj: Int): Boolean {
        for (k in 0 until 5) {
            val ni = i + k * di
            val nj = j + k * dj
            if (ni !in 0 until n || nj !in 0 until m || field[ni][nj] != c) {
                return false
            }
        }
        return true
    }
    
    // Проверяем все возможные выигрышные линии
    var hasWinner = false
    for (i in 0 until n) {
        for (j in 0 until m) {
            if (field[i][j] == '.') continue
            
            val c = field[i][j]
            // Проверяем горизонталь
            if (j + 4 < m && checkWin(c, i, j, 0, 1)) {
                hasWinner = true
                break
            }
            // Проверяем вертикаль
            if (i + 4 < n && checkWin(c, i, j, 1, 0)) {
                hasWinner = true
                break
            }
            // Проверяем главную диагональ
            if (i + 4 < n && j + 4 < m && checkWin(c, i, j, 1, 1)) {
                hasWinner = true
                break
            }
            // Проверяем побочную диагональ
            if (i + 4 < n && j - 4 >= 0 && checkWin(c, i, j, 1, -1)) {
                hasWinner = true
                break
            }
        }
        if (hasWinner) break
    }
    
    writer.write(if (hasWinner) "Yes" else "No")
    writer.newLine()

    reader.close()
    writer.close()
}