Решение
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, k) = reader.readLine().split(" ").map { it.toInt() }
// Считываем начальное состояние поля
val field = Array(n) { reader.readLine().split(" ").map { it.toInt() }.toIntArray() }
// Массив для хранения количества изменений для каждой клетки
val changes = Array(n) { IntArray(m) }
// Симулируем k итераций
var current = field
repeat(k) { iter ->
val next = Array(n) { IntArray(m) }
// Вычисляем следующее состояние для каждой клетки
for (i in 0 until n) {
for (j in 0 until m) {
// Считаем стабильных соседей
var stableNeighbors = 0
var activeNeighbors = 0
// Проверяем всех соседей (вверх, вниз, влево, вправо)
val directions = arrayOf(-1 to 0, 1 to 0, 0 to -1, 0 to 1)
for ((di, dj) in directions) {
val ni = i + di
val nj = j + dj
if (ni in 0 until n && nj in 0 until m) {
if (current[ni][nj] == 2) stableNeighbors++
if (current[ni][nj] == 2 || current[ni][nj] == 3) activeNeighbors++
}
}
// Применяем правила
next[i][j] = when {
stableNeighbors > 1 -> 2
activeNeighbors > 0 -> 3
else -> 1
}
// Увеличиваем счетчик изменений, если состояние изменилось
if (iter == 0 && next[i][j] != current[i][j]) changes[i][j]++
else if (iter > 0 && next[i][j] != current[i][j]) changes[i][j]++
}
}
current = next
}
// Выводим результат
for (i in 0 until n) {
writer.write(changes[i].joinToString(" "))
writer.newLine()
}
reader.close()
writer.close()
}