Здесь достаточно перебора с помощью рекурсии.
Вам нужно заполнить прямоугольник 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].
}
Если бы надо было считать число способов заполнения, надо было бы смотреть в сторону динамического программирования.