Первым делом выделяем связанные фигуры.
Изначально каждый отдельный квадрат и каждую фигуру помечаем "свободным".
В цикле, пока есть свободные квадраты:
пробегаемся по всем квадратам, если под квадратом пол или "замороженный" квадрат, морозим его;
пробегаемся по свободным фигурам, если в фигуре появились замороженные квадраты, морозим фигуру и остальные квадраты в фигуре;
пробегаемся по свободным фигурам, каждый квадрат из нее опускаем на 1 клетку вниз;
идем в начало цикла.
Если поле очень большое, можно попытаться посчитать более эффективно. Но это нужно заморочиться. Идея в том, что можно, пробежавшись по столбцам, оценить насколько могут фигуры двигаться относительно друг друга. И потом посмотреть на сколько их можно все опустить. Но дальше хз что делать =)