Кубики могут быть сделаны из шести квадратов по бокам. Но вы также можете сложить три прямоугольника 2x1 пополам и склеить их вместе, чтобы сформировать куб. Теперь в этом задании вы получите набор кусочков, каждый из которых сделан из квадратов, и вы должны определить, можете ли вы выбрать кусочки, чтобы сформировать единичный куб. Не все части должны быть использованы, могут быть некоторые остались.
Детали
Части представлены в виде строки из двух разных символов или черно-белого изображения или любого удобного 2D-растрового формата. Далее я предполагаю, что пиксели, которые формируют части, являются черными, а фон - белым.
Два пикселя, которые имеют общую сторону, считаются принадлежащими одной и той же части. Куски могут быть сложены только вдоль линий сетки, которые разделяют пиксели, и их нельзя разрезать. Каждая сторона куба имеет размер в один пиксель, а каждая сторона куба может состоять только из одного слоя.
Вывод должен быть истинным или ложным значением.
Testcases
Далее пробелы являются фоновыми, а хеш-символы
#
представляют фрагменты.
(больше будет добавлено)
действительный
##
##
##
#
####
#
# # # # # # #
# ##
## #
Недействителен
###
###
# #
####
### ## ####
Запустите следующий фрагмент для большего количества тестовых случаев.
PS: это обобщение этой проблемы
Ответы:
C
824803 байтаПопробуйте онлайн!
... и прежде чем объяснять это подробно, стоит посмотреть на высоком уровне.
Базовый обзор
Этот алгоритм применяет средство сопоставления с образцом для классификации каждого найденного полиомино с заданным образцом в качестве своего подмножества. Когда полиомино сопоставляются, они «не отмечены», исключая их снова из сопоставления с образцом. Первоначальная классификация, задаваемая сопоставителем, представляет собой просто подсчет количества плиток в полиомино.
Соответствующий метод применяется первым, чтобы отбросить все полиомино, которые нельзя сложить на куб; классификация этих многочленов отбрасывается. Совпадение будет успешным, если эти полиомино появляются в пределах более высокого уровня; поэтому мы заботимся только о наименьшем подмножестве «не раскрываемых» для каждого класса. Здесь показаны наряду с дополненными кодировками все такие polyominoes (исключая их вертикальные отражения). Кодирование использует биты 4-0 каждого символа для представления квадратов в каждой строке:
После того, как эти полиомино отбракованы, мы классифицируем оставшиеся полиомино в соответствующие категории. Стоит отметить, что почти во всех случаях можно просто найти оставшиеся полиомино (складывающиеся в кубы) и просто искать суммы по шесть. Есть два исключения:
Чтобы соответствовать этому ограничению, мы формируем 8 категорий: AH для мономино (одиночные плитки), B для домино, C для угловых тромино, D для линейных тромино, E для линейных тетромино, F для других тетромино, G для пентомино и H для гексомино. Все, что не попадает ни в одну из этих категорий, просто игнорируется. Достаточно подсчета полиомино, которые попадают в каждую категорию.
В конце мы просто возвращаем правдивость или ложность, основываясь на гигантском уравнении и этих таблицах.
Разгромленный с комментариями
источник