题目描述
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。
请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
思路:
先下结论,还是斐波那契
如同,如果第一个方块是纵向放置,则剩余的是f(n-1)种,
如果第一次放置时横向放置,则第二块位置只能横向放置,因此剩余f(n-2)种
因此:f(n) = f(n-1) + f(n-2)
故,显而易见,又是斐波那契数列。
f(1) = 1
f(2) = 2
f(3) = 3
.
.
.
f(n) = f(n-1) + f(n-2)
输入:
5
输出:
输入数据为: 5
输出:
有 5 个小矩形
共有 8 种方法。
代码
#include <iostream>
using namespace std;
class Solution{
public:
int rectCover(int number){
if(number == 1 || number == 2 || number == 0){
cout << "有 " << number << " 个小矩形" << endl << "共有 " << number << " 种方法。" << endl;
return number;
}
int num1(1),num2(2);
for (int i = 0; i < number - 2; ++i) {
num2 = num1 + num2;
num1 = num2 - num1;
}
cout << "有 " << number << " 个小矩形" << endl << "共有 " << num2 << " 种方法。" << endl;
return num2;
}
};
int main(){
Solution re;
int n(5);
cout << "输入数据为: " << n << endl << "输出: " << endl;
re.rectCover(n);
return 0;
}