Почему ландшафты появились в тематике ЕГЭ

В новых демоверсиях ЕГЭ всё чаще мелькают задачи на моделирование. Разработчики хотят видеть применение алгоритмов к реальным объектам. Ландшафт — наглядный пример. Он показывает знание массивов, случайных чисел и простейшей графики. Школьники видят результат сразу, что повышает мотивацию. При этом объём вычислений остаётся разумным и укладывается в ограничение по времени экзамена.
Коротко о процедурной генерации
Процедурной называют метод, когда большой мир строится по формуле, а не хранится целиком. Достаточно задать зерно случайности и правила. Дальше алгоритм создаёт горы, долины и реки сам. Экономится память, но главное — возрастает вариативность. Именно это ценят авторы игр и тестовых заданий. Абитуриент должен описать правило, а затем по нему получить нужную карту.
Перлин против простой случайности

Если взять чистый рандом, получится «шум» без структуры. Высоты соседних клеток будут резко меняться. Перлин-шум решает проблему. Он накладывает несколько волн разной частоты. Так рождаются пологие склоны и хребты. В учебной версии достаточно двух уровней сглаживания: базовая сетка 16×16 и более мелкая 4×4. Итоговая высота — сумма вкладов, нормированная к диапазону от 0 до 255. Такой рельеф уже можно отобразить оттенками серого.
Небольшой пример на Python
Ниже приведён упрощённый код. Он не претендует на идеальную оптимизацию, но иллюстрирует суть.
import random
SEED = 42
random.seed(SEED)
SIZE = 64
grid = [[0] * SIZE for _ in range(SIZE)]
def lerp(a, b, t):
return a + (b - a) * t
def perlin_like(x, y):
x0 = x // 16 * 16
y0 = y // 16 * 16
x1 = (x0 + 16) % SIZE
y1 = (y0 + 16) % SIZE
sx = (x - x0) / 16
sy = (y - y0) / 16
n00 = random.random()
n10 = random.random()
n01 = random.random()
n11 = random.random()
ix0 = lerp(n00, n10, sx)
ix1 = lerp(n01, n11, sx)
value = lerp(ix0, ix1, sy)
return int(value * 255)
for i in range(SIZE):
for j in range(SIZE):
grid[i][j] = perlin_like(i, j)
# Вывод частично
for row in grid[:8]:
print(row[:8])
Функция perlin_like выдаёт высоту клетки. На реальном экзамене достаточно сгенерировать нужный подмассив и вычислить параметры, указанные в условии.
Как уложиться в лимиты ЕГЭ

Чистый Перлин требует много вычислений. В КИМах обычно достаточно уменьшенной карты, например 256 клеток. Оптимизировать помогает кеширование промежуточных коэффициентов. Ещё важно избегать импортов тяжёлых библиотек. Можно обойтись только модулем random и базовыми операциями. Не забывайте про время чтения и вывода. Лишний принт способен украсть секунды.
Типичные ошибки выпускников
- Случайное зерно не фиксируется. Проверяющая программа получает другой результат.
- Используются float с высокой точностью. При округлении получается иной ответ.
- Путаница с осями. Ученики меняют строки и столбцы местами.
- Попытка рисовать графику в консоли. Она не требуется и замедляет код.
- Отсутствие проверки краёв массива. Индекс выходит за границу и вызывает ошибку.
Практическое mini-задание для тренировки

Сформулируйте задачу так. Дан квадрат 32×32. Высота клетки начинается с нуля. Случайно выбираем 50 точек и увеличиваем их высоту на 1. Затем для каждой клетки вычисляем среднее арифметическое высот соседей по Манхэттену радиуса два. Нужно вывести координаты клетки с максимальным значением. Задание проверяет работу со списками, вложенными циклами и агрегированием данных.
Полезные ресурсы и следующий шаг
Изучите открытый исходник noise.py. Он показывает реализацию классического Перлина. Посмотрите демоверсию ЕГЭ 2024, задания 3 и 17. Там скрыты те же идеи. Если хочется системно подтянуть практику, запишитесь на курс в онлайн школу подготовки к ЕГЭ. Там подробно разбирают алгоритмы, дают тесты и поддержку.