2*1的小矩形横着或竖着去覆盖更大的矩形,用82*1的小矩形无重叠地覆盖一个2*8的大矩形,总共有多少种方法?

解:把2*8的覆盖方法记为f(8),用第一个2*1的小矩形去覆盖大矩形的最左边时有两种选择,竖着放或横着放。当竖着放的时候,右边还剩下2*7的区域,这种情形下的覆盖方法记为f(7);当2*1的小矩形横着放在左上角的时候,左下角必须横着放一个2*1的小矩形,右边还剩下2*6的区域,这种情形下的覆盖方法记为f(6),因此f(8)=f(7)+f(6),f(1)=1f(2)=2,这实际是斐波拉契数列的变形应用,把斐波拉契数列的每一项向前移动了1位。

程序:

#include<stdio.h>


int fibonacci(int n)

{

int num1 = 1, num2 = 1, num3 = 0, i = 0;

if (n <= 1)

{

return num1;

}

for (i = 1; i < n; i++)

{

num3 = num1 + num2;

num1 = num2;

num2 = num3;

}

return num3;

}


int main()

{

int num = 0, ret = 0;

printf("请输入小矩形的个数:");

scanf("%d", &num);

ret = fibonacci(num);

printf("总共有%d种方法覆盖!\n", ret);

return 0;

}

结果:

请输入小矩形的个数:8

总共有34种方法覆盖!

请按任意键继续. . .