Я не знаю, как кратко описать цель, и поэтому я не смог найти применимый алгоритм, несмотря на обильный поиск, но на картинке ясно видно:
Учитывая состояние элементов в сетке слева, знает ли кто-нибудь об алгоритме для эффективного поиска конечных позиций, отображаемых в сетке справа? В этом случае все элементы "упали" "вниз", но направление, конечно, произвольное. Дело в том, что:
- Существует набор элементов произвольной формы, но все они состоят из смежных квадратов
- Элементы не могут пересекаться
- Все предметы должны перемещать максимальное расстояние в заданном направлении до тех пор, пока они не касаются стены, или они касаются другого предмета, который [... касается другого объекта до бесконечности...] касается стены.
Это не домашнее задание, я не студент. Это для моего интереса к геометрии и программированию. Я не упоминал этот язык, потому что это не имеет значения. Я могу реализовать любой алгоритм на языке, который я использую для конкретного проекта, над которым я работаю. Полезный ответ можно описать словами или кодом; это идеи, которые имеют значение.
Эта проблема, вероятно, может быть абстрагирована на какой-то график (в математическом смысле) зависимостей и провисания, поэтому, возможно, был бы адаптирован алгоритм, направленный на минимизацию времени запаздывания.
Если вы не знаете ответа, но собираетесь попытаться составить алгоритм на месте, просто помните, что могут быть круговые зависимости, например, с блокировкой розового (назад) "C" и синего "T" формы. Части T ниже C, а части C ниже T. Это было бы еще более сложно, если бы блокирующие элементы были заблокированы через "петлю" нескольких частей.
Некоторые примечания для применимого алгоритма: все следующее очень просто и быстро сделать из-за того, как я создал инфраструктуру управления объектами сетки:
- Перечислить отдельные квадраты в куске
- Перечислить все фрагменты
- Найдите фрагмент, если таковой имеется, занимая определенный квадрат в общей сетке.
Заметка о ответе: Маниф намекнул это первым, но bloops дал блестящее объяснение. Я думаю, что абсолютный ключ - это понимание того, что все части, перемещающие одну и ту же сумму, поддерживают свое отношение друг к другу, и поэтому эти отношения не нужно рассматривать.
Дополнительным ускорением для малонаселенной доски было бы смещение всех частей, чтобы исключить полностью пустые строки. Очень просто подсчитать пустые строки и идентифицировать фрагменты с одной стороны ( "выше" ) пустой строки.
Последнее примечание: Я действительно реализовал алгоритм, описанный bloops, с некоторыми изменениями, специфичными для реализации. Он прекрасно работает.