Напишите программу или функцию, которая при положительных значениях n и m рассчитывает количество действительных различных элементов домино, которые вы можете поместить в прямоугольник размером n на m . Это последовательность A099390 в онлайн-энциклопедии целочисленных последовательностей . Вы можете принимать входные данные как аргумент (ы) функции, CLA или stdin, в любом приемлемом формате. Вы должны вернуть или вывести одно целое число в качестве вывода.
Каждая плитка не должна оставлять пробелов, и учитывается каждая отдельная плитка, включая повороты, отражения и т. Д. Например, плитки для 2x3:
|-- ||| --|
|-- ||| --|
Пример входов / выходов:
1, 9 -> 0
2, 2 -> 2
2, 3 -> 3
4, 4 -> 36
4, 6 -> 281
6, 6 -> 6728
7, 10 -> 53175517
Ваша программа теоретически должна работать для любых n и m , но если вашей программе требуется слишком много памяти или ваш тип данных переполняется, это оправдано. Однако ваша программа должна работать правильно для любых n, m <= 8.
Самый короткий код в байтах побеждает.
Ответы:
Pyth,
3029 байтПопробуйте онлайн: демонстрация / тестовый пакет
Все примеры ввода выполняются в онлайн-компиляторе. Последний занимает несколько секунд.
Объяснение:
В моем коде я определю рекурсивную функцию
y
. Функцияy
берет список 2D-координат и возвращает количество различных элементов домино, используя эти координаты. Напримерy([[0,0], [0,1]]) = 1
(одно горизонтальное домино),y([[0,0], [1,1]]) = 0
(координаты не являются соседними) иy([[0,0], [0,1], [1,0], [1,1]]) = 2
(два горизонтальных или два вертикальных домино). После определения функции я буду называть его со всеми координатами[x,y]
сx in [0, 1, m-1], y in [0, 1, n-1]
.Как работает рекурсивная функция? Это довольно просто. Если список координат пуст, существует ровно один допустимый лист и
y
возвращается1
.В противном случае я беру первую координату в списке
b[0]
и ищу остальные координаты соседей. Если соседа нетb[0]
, тогда нет возможности тайлинга, поэтому я возвращаю 0. Если есть один или несколько соседей, тогда количество тайлингов равно (числу тайлингов, где я соединяюсьb[0]
с первым соседом через домину, плюс количество тайлингов, где я соединяюсьb[0]
со вторым соседом, плюс ...) Поэтому я вызываю функцию рекурсивно для каждого соседа с сокращенным списком (удаляя две координатыb[0]
и соседа). После этого я подвожу все результаты и возвращаю их.Из-за порядка координат всегда возможны только два соседа: один справа и один ниже. Но мой алгоритм не заботится об этом.
источник
Матлаб, 292
Я уверен, что это можно сократить, просто перенеся его на другой язык.
Основная идея - брутфорс: я придумал перечисление всех способов размещения
m*n/2
кирпичей домино наm*n
доске. Но это перечисление также включает в себя множество недопустимых значений (кирпичи, которые перекрывают или выходят за пределы доски). Таким образом, программа создает все эти значения и учитывает только действительные значения. Сложность выполнения составляет околоO(2^(m*n/2) * m*n)
. Память не является проблемой, так8x8
как ей нужна толькоO(m*n)
память. Но необходимое время8x8
составляет около 20 дней.Здесь полностью прокомментированная версия, которая объясняет, что происходит.
PS: Если кто-нибудь знает, как заставить работать подсветку синтаксиса Matlab, включите соответствующий тег в этот ответ!
Здесь полностью игра в гольф:
источник
C89, 230 байт
Для удобства чтения я включил этот ответ - все символы новой строки можно безопасно удалить до 230 байтов.
Определяет функцию,
int g(int n, int m)
которая возвращает количество элементов мозаичного изображения. Он использует вспомогательную функцию,f
которая перебирает все допустимые фрагменты, помещая одно домино, возвращая его, а затем удаляя домино на общей доске.источник
Python 243
Я выбрал подход грубой силы:
Если они все подходят и не осталось пробелов, у нас есть действительная запись.
Вот код:
источник