Решение задачи Game of Life на Python: пошаговый разбор алгоритма

Бесплатная консультация юриста

+7 (800) 302-87-29

Реклама jurik.ru

Вот решение задачи на 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)))

Пояснение работы алгоритма

  1. Чтение данных: считываем размер поля N, количество шагов T и начальную конфигурацию.
  2. Цикл по шагам: для каждого из T шагов создаём чистую сетку new_grid.
  3. Подсчёт соседей: для клетки (i, j) перебираем смещения di, dj ∈ {-1, 0, 1}. Координаты соседа вычисляются как (i + di) % n и (j + dj) % n, что автоматически обеспечивает «заворачивание» через край поля.
  4. Применение правил:
    • …
  5. Обновление состояния: после обработки всех клеток заменяем grid на new_grid.

Решение корректно обрабатывает все краевые случаи, включая пол16.