|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
07.04.2015, 17:03 | #1 |
Регистрация: 24.08.2013
Сообщений: 6
|
Задача о стене
Здравствуйте, подскажите пожалуйста идею алгоритма для следующей задачи:
Существует схема произвольной стены (с отверстиями, неустойчивая короче любая) из составленная из квадратов. Схема передается в формате матрицы из 1 и 0, где 1 - есть кирпич, 0 - нет. Также задан набор блоков высотой и шириной от 1 до 8 единиц. Необходимо определить возможно ли собрать заданную стену из заданного набора блоков (не обязательно использовать все блоки), при этом блоки можно ставить как горизонтально, так и вертикально. |
07.04.2015, 17:39 | #2 |
Новичок
Джуниор
Регистрация: 11.10.2011
Сообщений: 3,882
|
Я за перебор всех и вся..
А лучше ничего придумать не могу (пока(надеюсь)) |
07.04.2015, 18:12 | #3 |
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
Думал стену представлять в виде графа со степенью вершин 4, но профита это не даст по-ходу.
Но вот сходу, я бы выбрал все возможные наборы блоков из которых потенциально можно составить такую стену, а потом уже анализировал наборы. Очевидно, что сложность генерации наборов не выше сложности алгоритма укладки блоков. Но алгоритм решения задачи тогда будет выглядеть как <генерация наборов> + <укладка наборов>. Т.е. на асимптотическую сложность генерация негативного влияния не окажет. Генерация всех возможных наборов. Если в стене N кирпичей, то и в блоках из которых ее можно построить тоже должно быть N кирпичей. Суть в том, что генерация не учитывает форму. Все блоки имеют размер от 1 до 64. Надо создать массив из 64 элементов и раскидать по нему блоки. Алгоритм выдаст что-то типа 1+22+35, 22+36, ... (если в исходной стене имеется 58 кирпичей). В сумме участвуют размеры блоков, а не сами блоки). Если размер массива размера блоков постоянен то и количество наборов ограничено (тоже константно), значит по памяти алгоритм генерации будет иметь константную сложность. Алгоритм укладки наборов должен распределить все наборы блоков по стене. Очевидно, что его сложность - это <количество наборов> * <сложность укладки набора>. Так как количество наборов константно, то асимптотическая сложность укладки наборов, а значит и всего алгоритма равна сложности укладки одного набора. Но это уже гораздо более простая задача, потому что ВСЕ БЛОКИ НАБОРА ДОЛЖНЫ БЫТЬ ИСПОЛЬЗОВАНЫ. (это в корне отличает новую задачу от исходной). Последний раз редактировалось rrrFer; 07.04.2015 в 18:42. |
07.04.2015, 18:38 | #4 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Я думаю разбить стену на прямоугольники (ну типа ряда или столбца) в которых будут преобладать кирпичи одного размера (и меньшего размера, в случае если там будут дыры).
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика |
07.04.2015, 18:55 | #5 | |
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
Цитата:
Вопрос в том, что Код:
Возможны и более хитрые варианты, например Код:
Выше я описал как упростить задачу, но как добить ее до конца я не думал (и не буду скорее всего). Последний раз редактировалось rrrFer; 07.04.2015 в 19:00. |
|
07.04.2015, 21:00 | #6 |
Старожил
Регистрация: 02.01.2011
Сообщений: 3,323
|
Клёвая задача. Я хотел сделать минимальный частный случай, но даже он не так прост. Вот мои первые размышления
Если я правильно понял, минимальная стена - это 8x8 квадратиков (кирпичей). Это и есть минимальный частный случай Для этого случая пользователь вводит число блоков и размеры каждого блока, которые могут быть: 1x1, 2x3, 1x8, 8x8 и т.д. Минимальное количество блоков - один, то есть 8x8 кирпичей, а максимальное - 64 блоков с размерами 1x1 (блок равен кирпичу) К примеру, может быть такая ситуация, пользователь вводит: Код:
Вот бы написать функцию, которая бы принимала размеры матрицы и количество блоков, а возвращала бы массивы всевозможных комбинаций размеров блоков. Имея эти массивы, можно было бы найти среди них тот массив с размерами, который ввёл пользователь. Либо тот массив, который включается в массив введённый пользователем. Если нет среди этих массив того, который включается в массив пользователя целиком, то построить стену без дыр нельзя Последний раз редактировалось 8Observer8; 07.04.2015 в 21:13. |
07.04.2015, 21:13 | #7 | ||
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
Цитата:
Цитата:
Перечитай еще раз задачу. |
||
07.04.2015, 21:14 | #8 | |
Новичок
Джуниор
Регистрация: 11.10.2011
Сообщений: 3,882
|
Цитата:
А разбивать.. Чейто я не верю, что это можно делать хорошо |
|
07.04.2015, 21:15 | #9 |
Старожил
Регистрация: 02.01.2011
Сообщений: 3,323
|
Из фразы, что "задан набор блоков высотой и шириной от 1 до 8 единиц"
|
07.04.2015, 21:17 | #10 | |
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
Цитата:
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Facebook, Post-запрос на стене | Chuck_ | C# (си шарп) | 4 | 04.09.2014 21:13 |
Задача по подсчёту статистики использования букв. Другая задача - по длинной арифметике Pascal ABC | kimberly | Паскаль, Turbo Pascal, PascalABC.NET | 3 | 24.12.2012 17:03 |
Задача на оптимальный расчет маршрута (задача в презентации) в табличном процессоре Excel | Toofed | Помощь студентам | 0 | 30.11.2011 01:12 |
Задача минимизации дисбаланса на линии сборки (задача минимакса) | LenZab | Microsoft Office Excel | 13 | 13.03.2011 22:51 |