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