Расчет количества замощений прямоугольника меньшими прямоугольниками?

Здравствуйте!
Пусть у нас есть большой прямоугольник.
Так же есть безлимитная куча маленьких одинаковых прямоугольников, с соотношением сторон 2:1, например 100x50.

Нужно рассчитать и и зафиксировать все способы замощения большого прямоугольника маленькими, так что бы они не выходили за грани большого и были плотно прижаты друг к другу.

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

Картинку прикрепляю (для примера два варианта замощения).
4106f0e652d248a4a51631c08fdbc4f7.JPG

Какие алогоритмы для этого существуют? В какую сторону смотреть?
  • Вопрос задан
  • 3921 просмотр
Решения вопроса 1
Mrrl
@Mrrl
Заводчик кардиганов
Здесь достаточно перебора с помощью рекурсии.
Вам нужно заполнить прямоугольник M*N плитками размером 1*2.
Берёте массив A[M,N], заполняете его нулями.
Вызываете функцию Fill(A,1).
Fill(A,k){
Ищете первый элемент A[p,q], равный нулю.
Если не нашли - массив заполнен, печатаете его. return.
Если элемент A[p+1,q] существует и равен нулю, то в прямоугольник можно положить горизонтальную плитку: в A[p,q] и A[p+1,q] кладёте число k, вызываете Fill(A,k+1). Обнуляете A[p,q] и A[p+1,q].
Если элемент A[p,q+1] существует и равен нулю, то в прямоугольник можно положить вертикальную плитку: в A[p,q] и A[p,q+1] кладёте число k, вызываете Fill(A,k+1). Обнуляете A[p,q] и A[p,q+1].
}
Если бы надо было считать число способов заполнения, надо было бы смотреть в сторону динамического программирования.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы