c语言:用8个2*1的小矩形横着或竖着无重叠地覆盖一个2*8的大矩形,总共有多少种方法?
2016-05-29 13:40
555 查看
用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种方法覆盖!请按任意键继续. . .
本文出自 “岩枭” 博客,请务必保留此出处http://yaoyaolx.blog.51cto.com/10732111/1742290
#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种方法覆盖!请按任意键继续. . .
本文出自 “岩枭” 博客,请务必保留此出处http://yaoyaolx.blog.51cto.com/10732111/1742290
相关文章推荐
- c语言:输入两个正整数m和n,求其最大公约数和最小公倍数
- c语言:输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。
- c语言:∑k(k取[1,100])+∑k^2(k取[1,50])+∑1/k(k取[1,10])的和
- c语言:编程找出1000之内的所有完数。
- c语言:两个乒乓球队进行比赛,各出3人,A说他不和x比,C说他不和x,z比。找出3对赛手的名单
- c语言:用迭代法求x=a^0.5,迭代公式为x1 = (x0 + a / x0) / 2;前后两次求出的x的差的绝对值小于10^-5
- c语言:用牛顿迭代法求方程在1.5附近的根:2x^3-4x^2+3x-6=0.
- c语言:用二分法求方程在(-10,10)之间的根:2x^3-4x^2+3x-6=0.
- c语言:把只含因子2、3和5的数称为丑数,求按从小到大的顺序的第1500个丑数(两种方法比较)
- c语言:对10个数组元素依次赋值为0,1,2,3,4,5,6,7,8,9,要求按逆序输出。
- c语言:用数组来处理求Fibonacci数列问题
- c语言:有10个地区的面积,要求它们按从小到大的顺序排列。(起泡法的应用)
- c语言:将一个二维数组行和列的元素互换,存到另一个二维数组中。
- c语言:3*4的矩阵,编程序求出其中最大的那个元素的值,以及其所在的行号和列号。(打擂台算法)
- c语言:输出一个菱形图
- c语言:输入一行字符,统计其中有多少个单词,单词之间用空格分隔开
- c语言:有3个字符串,找出其中最大者
- c语言:调用函数打印How do you do!
- c语言:用函数找大数
- c语言:用scanf函数输入数据,举例并分析错误原因