Элемент 2D-сортировки
Сегодня у меня нет готовой идеи, поэтому давайте обсудим недоделанную.
В игре The Farmer Was Replaced есть подигра, в которой вы сажаете кактусы. Довольно сложное описание правил игры сводится к довольно простой идее: чтобы сбор кактусов был эффективным, необходимо отсортировать 2D-матрицу высот кактусов. Т.е. кактусы становятся больше, когда вы двигаетесь вверх или вправо.
И, конечно, есть ограничения. Вы можете перемещать агента (дрона), и он может менять местами под собой кактус с соседними кактусами. Это предотвращает обмены на большие расстояния, типичные для традиционных алгоритмов сортировки, таких как быстрая сортировка или сортировка слиянием, и дает временную сложность O(n³) для n, длины стороны квадратного поля.
В игре есть глобальная таблица лидеров и первое место составляет 17 секунд на поле 8х8. Моя лучшая попытка на данный момент — 24,3 с. Это 2D-модификация сортировки вставкой, которую я публиковал здесь некоторое время назад.
И сегодня я попробую подход, изображенный на картинке. C — текущая позиция дрона. Остальные буквы - это соседи. Идея, которую я хочу проверить:
- напишите небольшую оптимальную процедуру, которая сортирует крест по порядку
- сканируем поле, применяем алгоритм к каждой ячейке
- запустить сортировку вставкой
Моя интуиция подсказывает, что эта «кросс-локальная оптимизация» может дешево переместить кактусы далеко как в горизонтальном, так и в вертикальном направлении, и она должна снять часть нагрузки с сортировки вставкой.
