Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.04.2015, 17:03   #1
Svejk
 
Регистрация: 24.08.2013
Сообщений: 6
По умолчанию Задача о стене

Здравствуйте, подскажите пожалуйста идею алгоритма для следующей задачи:
Существует схема произвольной стены (с отверстиями, неустойчивая короче любая) из составленная из квадратов. Схема передается в формате матрицы из 1 и 0, где 1 - есть кирпич, 0 - нет. Также задан набор блоков высотой и шириной от 1 до 8 единиц. Необходимо определить возможно ли собрать заданную стену из заданного набора блоков (не обязательно использовать все блоки), при этом блоки можно ставить как горизонтально, так и вертикально.
Svejk вне форума Ответить с цитированием
Старый 07.04.2015, 17:39   #2
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Я за перебор всех и вся..
А лучше ничего придумать не могу (пока(надеюсь))
Poma][a вне форума Ответить с цитированием
Старый 07.04.2015, 18:12   #3
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Думал стену представлять в виде графа со степенью вершин 4, но профита это не даст по-ходу.

Но вот сходу, я бы выбрал все возможные наборы блоков из которых потенциально можно составить такую стену, а потом уже анализировал наборы.
Очевидно, что сложность генерации наборов не выше сложности алгоритма укладки блоков.
Но алгоритм решения задачи тогда будет выглядеть как <генерация наборов> + <укладка наборов>.
Т.е. на асимптотическую сложность генерация негативного влияния не окажет.

Генерация всех возможных наборов.
Если в стене N кирпичей, то и в блоках из которых ее можно построить тоже должно быть N кирпичей.

Суть в том, что генерация не учитывает форму. Все блоки имеют размер от 1 до 64. Надо создать массив из 64 элементов и раскидать по нему блоки.

Алгоритм выдаст что-то типа 1+22+35, 22+36, ... (если в исходной стене имеется 58 кирпичей). В сумме участвуют размеры блоков, а не сами блоки).

Если размер массива размера блоков постоянен то и количество наборов ограничено (тоже константно), значит по памяти алгоритм генерации будет иметь константную сложность.

Алгоритм укладки наборов должен распределить все наборы блоков по стене. Очевидно, что его сложность - это <количество наборов> * <сложность укладки набора>.

Так как количество наборов константно, то асимптотическая сложность укладки наборов, а значит и всего алгоритма равна сложности укладки одного набора.

Но это уже гораздо более простая задача, потому что ВСЕ БЛОКИ НАБОРА ДОЛЖНЫ БЫТЬ ИСПОЛЬЗОВАНЫ. (это в корне отличает новую задачу от исходной).

Последний раз редактировалось rrrFer; 07.04.2015 в 18:42.
rrrFer вне форума Ответить с цитированием
Старый 07.04.2015, 18:38   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Я думаю разбить стену на прямоугольники (ну типа ряда или столбца) в которых будут преобладать кирпичи одного размера (и меньшего размера, в случае если там будут дыры).
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 07.04.2015, 18:55   #5
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Я думаю разбить стену на прямоугольники (ну типа ряда или столбца) в которых будут преобладать кирпичи одного размера (и меньшего размера, в случае если там будут дыры).
Дак все кирпичи одного размера.

Вопрос в том, что
Код:
110
110
100
Можно разбить на (1111), (11) ИЛИ (11), (11), (1) ИЛИ ((11),(11)), (1)

Возможны и более хитрые варианты, например
Код:
00100
11110
00111
01111
Тут может быть сходу k*k вариантов разделения, поэтому это не канает.
Выше я описал как упростить задачу, но как добить ее до конца я не думал (и не буду скорее всего).

Последний раз редактировалось rrrFer; 07.04.2015 в 19:00.
rrrFer вне форума Ответить с цитированием
Старый 07.04.2015, 21:00   #6
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Клёвая задача. Я хотел сделать минимальный частный случай, но даже он не так прост. Вот мои первые размышления

Если я правильно понял, минимальная стена - это 8x8 квадратиков (кирпичей). Это и есть минимальный частный случай

Для этого случая пользователь вводит число блоков и размеры каждого блока, которые могут быть: 1x1, 2x3, 1x8, 8x8 и т.д. Минимальное количество блоков - один, то есть 8x8 кирпичей, а максимальное - 64 блоков с размерами 1x1 (блок равен кирпичу)

К примеру, может быть такая ситуация, пользователь вводит:

Код:
Количество блоков: 5

Размер 1-ого блока: 1x8
Размер 2-ого блока: 2x4
Размер 3-ого блока: 2x4
Размер 4-ого блока: 5x4
Размер 5-ого блока: 5x4

Ответ: стену можно построить без дыр
Прикрепил иллюстрацию

Вот бы написать функцию, которая бы принимала размеры матрицы и количество блоков, а возвращала бы массивы всевозможных комбинаций размеров блоков. Имея эти массивы, можно было бы найти среди них тот массив с размерами, который ввёл пользователь. Либо тот массив, который включается в массив введённый пользователем. Если нет среди этих массив того, который включается в массив пользователя целиком, то построить стену без дыр нельзя
Изображения
Тип файла: png Wall.png (3.3 Кб, 157 просмотров)

Последний раз редактировалось 8Observer8; 07.04.2015 в 21:13.
8Observer8 вне форума Ответить с цитированием
Старый 07.04.2015, 21:13   #7
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Если я правильно понял, минимальная стена - это 8x8 квадратиков (кирпичей).
Интересно из какой фразы ты это "понял"?

Цитата:
Ответ: стену можно построить без дыр
Вопрос "можно ли строить стену без дыр" никто не ставил.

Перечитай еще раз задачу.
rrrFer вне форума Ответить с цитированием
Старый 07.04.2015, 21:14   #8
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
Также задан набор блоков высотой и шириной от 1 до 8 единиц.
Отсюда

А разбивать.. Чейто я не верю, что это можно делать хорошо
Poma][a вне форума Ответить с цитированием
Старый 07.04.2015, 21:15   #9
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Из фразы, что "задан набор блоков высотой и шириной от 1 до 8 единиц"
8Observer8 вне форума Ответить с цитированием
Старый 07.04.2015, 21:17   #10
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Из фразы, что "задан набор блоков высотой и шириной от 1 до 8 единиц"
Ну задан набор блоков, а причем тут "минимальный размер стены"?
rrrFer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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