问题:我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
这是一道斐波那契类型的题目
n=1 f(n)=1
n=2 f(n)=2
n=3 横着摆
![]() | ![]() | |
此时下面两空摆法也相应确定,所以剩下来f(3-2)
竖着摆
![]() | ||
![]() |
此时,剩下来f(3-1)种摆法
即f(3)=f(3-1)+f(3-2)
n=n时,f(n)=f(n-1)+f(n-2)
递归代码如下:
int RectCover(int number) {
if(number <= 1){
return 1;
}
if(number == 2){
return 2;
}
return rectCover(number-1)+rectCover(number-2);}
迭代代码如下: int rectCover(int number) {
if (number <= 0) {
return number;
}
int step_vertical= 1;//2*1的竖着摆,占用一个2*1
int step_acorss = 2;//横着摆,下面的空也明确只有一种摆法
int step;//总的摆法
for (int i = 3; i <= number; i++) {
step = step_vertical + step_across;
step_vertical =step_across;//前一步的横摆成为下一步的竖摆方法数
step_across = step;前一步的方法数成为下一步的横摆方法数
}
return step;
}