@Atllantis

Кто хочет поломать немного мозг?

Мой мозг уже выкипает... И я никак не могу придумать алгоритм для слудующего:
И так, есть координатная сетка с ячейками/пикселями/квадратами и т.п. (придумай ещё!):
5623a6f85f134812aa2386302b346b0e.png
Нужно все квадраты (красные) разместить друг на друге внизу.
Всё вроде бы просто, но есть одно НО. Есть спаяные квадраты, часть которых не может быть ниже или выше другой.
Например:
Квадраты в ячейках [5,2] и [5,3] опустятся на 1 ячейку вниз по оси Y.
Тогда спаяный квадрат должен будет опуститься только на две ячейки вниз.

В итоге должно получиться так:
0c04f6134431464cb6343597bee997b0.png
Если бы не было спаяных квадратов, то решение было бы простым:
Проходим циклом по оси X, и в каждой клетке (по оси Х) проверяем все ячейки по оси У (снизу вверх). Считаем кол-во пустых клеток до квадрата и опускаем квадрат вниз на подсчитанное кол-во пустых клеток.
Но как быть со спаянными квадратами?
  • Вопрос задан
  • 444 просмотра
Пригласить эксперта
Ответы на вопрос 5
tsarevfs
@tsarevfs
C++ developer
Первым делом выделяем связанные фигуры.
Изначально каждый отдельный квадрат и каждую фигуру помечаем "свободным".
В цикле, пока есть свободные квадраты:
пробегаемся по всем квадратам, если под квадратом пол или "замороженный" квадрат, морозим его;
пробегаемся по свободным фигурам, если в фигуре появились замороженные квадраты, морозим фигуру и остальные квадраты в фигуре;
пробегаемся по свободным фигурам, каждый квадрат из нее опускаем на 1 клетку вниз;
идем в начало цикла.

Если поле очень большое, можно попытаться посчитать более эффективно. Но это нужно заморочиться. Идея в том, что можно, пробежавшись по столбцам, оценить насколько могут фигуры двигаться относительно друг друга. И потом посмотреть на сколько их можно все опустить. Но дальше хз что делать =)
Ответ написан
Комментировать
@mamkaololosha
010
010
010
Это палка. Остальные фигуры можешь сделать так же. И колизить единицы.
Ответ написан
Fett
@Fett
Разработчик
Проходим циклом по оси X, и в каждой клетке (по оси Х) проверяем все ячейки по оси У (снизу вверх). Считаем кол-во пустых клеток до квадрата и опускаем квадрат вниз на подсчитанное кол-во пустых клеток.

Зачем вы опускаете столбцы? Опускайте строки, проходите циклом снизу вверх и итерируйте до тех пор, пока будут изменения.
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Это обычный тетрис в невесомости.
Вначале поднимаем все фигуры вверх и заполняем строку за строкой.
Если надо лучше - уже комбинаторика.
Ответ написан
Комментировать
@abcd0x00
Проходим циклом по оси X, и в каждой клетке (по оси Х) проверяем все ячейки по оси У (снизу вверх).

Представь себе спаянную фигуру в виде лестницы из квадратов. При этом она спаяна целиком. И как ты её будешь проверять?

Тут нужно саму фигуру делать объектом, который состоит из квадратов. А каждый квадрат должен знать, можно ли его сдвинуть в любую сторону. Тогда, чтобы сдвинуть всю фигуру, она должна будет просто опросить все свои квадраты.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы