|
11 / 11 / 4
Регистрация: 22.09.2016
Сообщений: 90
|
|
Определить количество способов укладки паркета14.10.2016, 14:44. Показов 6951. Ответов 31
Всем привет. Помогите пожалуйста разобраться в решении задачи о паркете.
Собственно сама задача: Комнату размером n*m единиц требуется покрыть одинаковыми плитками паркета размером 2*1 единиц без пропусков и наложений (m<=20, n<=8, m,n -целые). Пол можно покрыть паркетом различными способами. Требуется определить количество всех возможных способов укладки паркета для конкретных значений m<=20, n<=8. Результатом задачи является таблица, содержащая 20 строк и 8 столбцов.Элементом таблицы является число, являющееся решением задачи для соответствующих n и m. Решения этой задачи: Файл pdf - книга Окулова Программирование в алгоритмах - стр 120. она же для тех кто не хочет качать Просто вообще не дается осознание этого решения. Вводятся какие то сечения закодированные в единицах и нулях. Но если мы предполагаем подсчет вариантов полностью заполненного поля - зачем нули в сечениях. А если плитка расположена перпендикулярно этому самому сечению - как мы поймем в каком сечении ее продолжение. Вобщем вообще ничего не удается понять(
0
|
|
| 14.10.2016, 14:44 | |
|
Ответы с готовыми решениями:
31
Определить количество способов укладки плиток на оставшиеся места Определить количество различных способов допрыгать до финиша Определить количество способов перемещения по смежным граням куба |
|
2904 / 1937 / 211
Регистрация: 05.06.2011
Сообщений: 5,723
|
|
| 14.10.2016, 17:23 | |
|
Там же просто, как всё гениальное
![]() Проводим вертикаль. Идём сверху вниз и заполняем число: если вертикаль проходит по границе плиток — ставим ноль, если разрезаем плитку — 1. Дальше медитируем на связь соседних вертикалей: если, скажем, в левой ноль, то в правой может быть ноль либо единица; если в левой единица, то в правой только ноль. На самом деле, там чуток посложнее (например, в обеих нули на некой позиции требуют аналогичного выше либо ниже); однако же, куда проще исходной задачи
1
|
|
|
11 / 11 / 4
Регистрация: 22.09.2016
Сообщений: 90
|
|
| 15.10.2016, 16:52 [ТС] | |
|
iifat, так уже гораздо понятнее спасибо)
Поправьте если ошибаюсь, но в книге совсем другое объяснение, цитата: "Плитки, встречающиеся на пути разреза, обходим справа, т. е. при движении сверху вниз на каждом шаге либо обходим справа выступающую клетку, либо нет" При таком подходе совершенно не понятно как определить горизонтально располагаются плитки или нет. Хотя теперь не понятно как определить наличие или отсутствие плитки. если только объединить ваш способ и предложенный в книге. Я в том направлении мыслю? Добавлено через 15 минут Или случаи когда есть пустые клетки мы вообще не рассматриваем?
0
|
|
|
2904 / 1937 / 211
Регистрация: 05.06.2011
Сообщений: 5,723
|
||||
| 15.10.2016, 19:01 | ||||
Сообщение было отмечено Serg4356 как решение
Решение
1
|
||||
|
11 / 11 / 4
Регистрация: 22.09.2016
Сообщений: 90
|
||
| 15.10.2016, 21:23 [ТС] | ||
|
0
|
||
|
11 / 11 / 4
Регистрация: 22.09.2016
Сообщений: 90
|
|
| 15.10.2016, 21:35 [ТС] | |
|
Вот то есть как как то так должно получаться?
0
|
|
|
2904 / 1937 / 211
Регистрация: 05.06.2011
Сообщений: 5,723
|
|
| 16.10.2016, 05:40 | |
|
Получиться — что? Рельефы — первый, второй, третий — выписаны верно. Не хватает нулевого и четвёртого. Но это ж только начало...
1
|
|
|
11 / 11 / 4
Регистрация: 22.09.2016
Сообщений: 90
|
|||||||||||
| 19.10.2016, 14:12 [ТС] | |||||||||||
|
Пока не понимаю назначения 0 и 4 сечения, тк они всегда должны быть нулевыми. Ну да начало...
Нашел программу реализующую решение этой задачи, но в ней что то не так, тк количество расположений для комнаты длиной/шириной 2 клетки это не ряд Фибоначчи. Собственно сам код: Кликните здесь для просмотра всего текста
В данной программе не понятен метод Can(), где сечение зачем то сопоставляется со степенью 2, и метод Solve() где в цикле проверяются все варианты сечений, а в этом месте: Кликните здесь для просмотра всего текста
счетчик количества вариантов заполнения увеличивается не в момент заполнения всего поля, а в момент нахождения соответствующих друг другу сечений(если я правильно понял метод Can)
0
|
|||||||||||
|
2904 / 1937 / 211
Регистрация: 05.06.2011
Сообщений: 5,723
|
|
| 19.10.2016, 16:16 | |
|
Дык именно и весь алгоритм.
Последовательно для каждой вертикали и каждого сечения считаем варианты плотных укладок. Шаг (вертикальное сечение Подсчёт вариантов укладки: есть совместимые и несовместимые соседние сечения — это понятно, да? Например, если в 5 сечении где-то стоит единица, то бишь, пятое сечение разрезает плитку, то в шестом обязан стоять нуль. Судя по алгоритму, промежуток между двумя совместимыми сечениями можно замостить единственным способом (что-то мне это сомнительно, но это я потом подумаю). Итак: если на шестой вертикали сечение вот такое, то на пятой одно из совместимых, причём достраивается единственным способом. То бишь, количество способов замостить прямоугольник слева до конкретного сечения шестой линии равно сумме аналогичных способов для совместимых сечений пятой линии. Добавлено через 38 секунд И да, процедуру Can ещё не просёк до конца. Подумаю и напишу. Добавлено через 8 минут Собственно, совместимость определяется так. По каждому разряду. (0,1) (в смысле, в i-м 0 (i-я вертикаль не разрезает плитку), в i+1-м 1 (i+1-я вертикаль разрезает)) — допустимо (необходимо положить одну плитку горизонтально вплотную к i-й вертикали); (1,0) — допустимо и получается автоматически; (1,1) — недопустимо; (0,0) — допустимо, если в следующеё позиции та же конфигурация (необходимо положить плитку вертикально, так что она займёт две горизонтали).
1
|
|
|
11 / 11 / 4
Регистрация: 22.09.2016
Сообщений: 90
|
||||||||||||||||||
| 19.10.2016, 19:36 [ТС] | ||||||||||||||||||
|
Вот если у нас количество разрядов(длина пола) = 4, а первое сечение - это 0 (0000) второе 3 (0011), метод Can выдает - false. Почему? В программе я понимаю логику и почему так вышло, но на практике? На картинке, которую я выше прикладывал как раз такая ситуация с сечениями(если брать второе и третье сечение). И почему в этом методе сравниваются не аргументы k, l (которые вроде как сами по себе являются этими сечениями) между собой, а сравниваются с каким-то d, которое = количество разрядов в квадрате? И в любом случае насчет корректности решения, опытным путем я получил: при размерах пола:
Программа выдает решение: 0|2|4|10|18... Как так?
0
|
||||||||||||||||||
|
2904 / 1937 / 211
Регистрация: 05.06.2011
Сообщений: 5,723
|
|||
| 20.10.2016, 02:45 | |||
|
А, несколько соврал, разряды проходятся справа налево, так что false будет выдана сразу. Впрочем, это мало что меняет. d — никакое не количество разрядов. d — маска для выделения очередного разряда. Чтобы выделить i-й разряд (считая от нуля справа), берём
1
|
|||
|
11 / 11 / 4
Регистрация: 22.09.2016
Сообщений: 90
|
|
| 20.10.2016, 07:48 [ТС] | |
|
А блин, элементарно же было. Насчет d понял, спасибо.
Но при смене || на && мало что меняется правда... Добавлено через 34 минуты Тогда вопрос почему цикл по сопоставлению разрядов в Can() начинается с 1 а не с 0?
0
|
|
|
2904 / 1937 / 211
Регистрация: 05.06.2011
Сообщений: 5,723
|
||
| 20.10.2016, 10:09 | ||
|
Точнее говоря, подозреваю, ответ на именно его простой: в java массивы стандартно нумеруются с единицы, в отличие от Цэ. Уточняю: это предположение; как там в java — не знаю. А вот возводить в степень надо таки с нулевой! Попробуй в строке 27 поставить (i-1) вместо i.
1
|
||
|
11 / 11 / 4
Регистрация: 22.09.2016
Сообщений: 90
|
|
| 20.10.2016, 11:43 [ТС] | |
|
На java тоже с 0 нумеруются.
Попробовал с 0 начать: Can(0, 3, 4) = false. Если в 27 строке поставить i-1 - решение для n=2: 1|3|7|14|26... Вобщем не помогло, хотя так правильно. Седня вечером попробую еще раз свой вариант написать, теперь хоть понимаю некоторые хитрости
0
|
|
|
2904 / 1937 / 211
Регистрация: 05.06.2011
Сообщений: 5,723
|
||
| 20.10.2016, 14:49 | ||
|
Хм. Эдак я, кажись, скоро сам попробую...
1
|
||
|
11 / 11 / 4
Регистрация: 22.09.2016
Сообщений: 90
|
|
| 20.10.2016, 20:22 [ТС] | |
|
Чел на stackoverflow ответил:
ru|stackoverflow|com/questions/580611/%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0-%D0%BE-%D0%BF%D0%B0%D1%80%D0%BA%D0%B5%D1%82%D0% B5/580636?noredirect=1#comment771672_580636 + написал код на плюсах вроде. Может кому поможет
0
|
|
|
2904 / 1937 / 211
Регистрация: 05.06.2011
Сообщений: 5,723
|
|||||||||||
| 21.10.2016, 20:29 | |||||||||||
|
Хм. Написал таки. Насчёт 37 строки, оказывается, соврал: там и правда ||. Вот программа, попробуй сравнить. Java у меня, правда, нет, я для таких случаев пользую TCL, но, думаю, разберёшься.
Кликните здесь для просмотра всего текста
1
|
|||||||||||
|
11 / 11 / 4
Регистрация: 22.09.2016
Сообщений: 90
|
|||||||
| 24.10.2016, 10:51 [ТС] | |||||||
|
Ну вот полностью мой код: Кликните здесь для просмотра всего текста
он вроде как бы работает, но как бы и не знаю. Тут использовал ArrayList для сохранения правых сечений, чтобы потом сравнивать с левыми(в данный момент закомментил, т.к. пытался через логику и перебор делать). Объясню почему. Если мы сравниваем правое сечение с левым с помощью перебора то вполне вероятна такая ситуация: acceptCut(2,0,3) = true (что не корректно), и с текущей логикой acceptCut(0,2,3) = false (что корректно). Соответственно если левые сечения не проверяются а сохраняются из правых и потом используются - такой ошибки не возникает. Как засунуть это в логику я не понимаю. Есть ситуации когда сечение может начинаться с 01 например для случаев (33, 18, 6) (как на картинке - сечение 3), а есть ситуации когда не может - например (0,2,3). И я хоть и с трудом понимаю ваш код (и парня со стэковерфлоу) но не замечаю таких заглушек-исключений на несколько строк в сравнении сечений, и кароче опять не догоняю. Вроде бы способ с сохранением правых значений и использованием их потом как левых работает, но я не знаю куда сохранять корректные значения. ArrayList при m=20 n=8 загибается с Java heap space, при меньших значениях заметно долго думает. Да и вообще брутфорс же) не элегантно ни разу. Вот можете мне объяснить при сопоставлении двух сечений они генерятся? и какая там логика в приведенном выше случае З.Ы. Прошу прощения за закоменченные куски кода, они вроде как нужны для понимания значения ArrayList
0
|
|||||||
|
11 / 11 / 4
Регистрация: 22.09.2016
Сообщений: 90
|
|
| 24.10.2016, 10:57 [ТС] | |
|
Картинка
0
|
|
|
2904 / 1937 / 211
Регистрация: 05.06.2011
Сообщений: 5,723
|
|
| 25.10.2016, 08:35 | |
|
1
|
|
| 25.10.2016, 08:35 | |
|
Помогаю со студенческими работами здесь
20
Клетчатая доска - Определить количество способов добраться до последней клетки N-M
Рекурсия: определить количество способов, которыми можно расставить n книг на полке
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20%
kYBz3eJf3jQ
|
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
|
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
|
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора
Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2.
Задача: уведомлять пользователя, если. . .
|
|
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
|
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2.
Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
|
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
|
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
|