用2*1的小矩形横着或竖着去覆盖更大的矩形,用8个2*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)=1,f(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种方法覆盖!
请按任意键继续. . .