Вот решение задачи на Python с пошаговым объяснением алгоритма.
Решение
Основная идея — напрямую смоделировать T шагов эволюции клеточного автомата. Поскольку ограничения небольшие (N, T ≤ 100), алгоритм с асимптотикой O(T·N²) работает мгновенно.
Ключевые моменты
- Периодические граничные условия (тор): при переходе за край поля индексы «заворачиваются» с помощью операции modulo,
(i + di) % N. - Двойной буфер: на каждом шаге создаём новую сетку
new_grid, чтобы изменения текущего шага не влияли на подсчёт соседей в этом же шаге. - Подсчёт соседей: для каждой клетки проверяем 8 соседних позиций (исключая саму клетку).
Код
n, t = map(int, input.split)
grid = [list(map(int, input.split)) for _ in range(n)]
for _ in range(t):
new_grid = [[0] * n for _ in range(n)]
for i in range(n):
for j in range(n):
# 1. Подсчёт живых соседей с учётом тороидальных границ
neighbors = 0
for di in (-1, 0, 1):
for dj in (-1, 0, 1):
if di == 0 and dj == 0:
continue
ni = (i + di) % n
nj = (j + dj) % n
neighbors += grid[ni][nj]
# 2. Применение правил Conway’s Game of Life
if grid[i][j] == 1:
# Клетка жива: выживает только при 2 или 3 соседях
if neighbors == 2 or neighbors == 3:
new_grid[i][j] = 1
else:
# Клетка мёртва: рождается только при ровно 3 соседях
if neighbors == 3:
new_grid[i][j] = 1
# Переход к следующему шагу
grid = new_grid
for row in grid:
print(‘ ‘.join(map(str, row)))
Пояснение работы алгоритма
- Чтение данных: считываем размер поля N, количество шагов T и начальную конфигурацию.
- Цикл по шагам: для каждого из T шагов создаём чистую сетку
new_grid. - Подсчёт соседей: для клетки
(i, j)перебираем смещенияdi, dj ∈ {-1, 0, 1}. Координаты соседа вычисляются как(i + di) % nи(j + dj) % n, что автоматически обеспечивает «заворачивание» через край поля. - Применение правил:
- …
- Обновление состояния: после обработки всех клеток заменяем
gridнаnew_grid.
Решение корректно обрабатывает все краевые случаи, включая пол16.