剑指offer 矩形覆盖(C++)

题目描述

我们可以用2×12\times12×1的小矩形横着或者竖着去覆盖更大的矩形。请问用nnn2×12\times 12×1的小矩形无重叠地覆盖一个2×n2 \times n2×n的大矩形,总共有多少种方法?

比如n=3n=3n=3时,2×32\times32×3的矩形块有333种覆盖方法:

在这里插入图片描述

解题思路

显然是一道递推类题目,可以使用迭代或者递归方法解决。

为方便起见,nnn个矩形的覆盖总数用Cover(n)Cover(n)Cover(n)来表示。

通过画图,

n=1n = 1n=1时,Cover(1)=1Cover(1) = 1Cover(1)=1

n=2n = 2n=2时,Cover(2)=2Cover(2) = 2Cover(2)=2

n=3n = 3n=3时,Cover(3)=3Cover(3) = 3Cover(3)=3

n=4n = 4n=4时,Cover(4)=5Cover(4) = 5Cover(4)=5

n=5n = 5n=5时,Cover(5)=8Cover(5) = 8Cover(5)=8

n=6n = 6n=6时,Cover(6)=13Cover(6) = 13Cover(6)=13

.....................

n=nn = nn=n时,Cover(n)=Cover(n−1)+Cover(n−2)Cover(n) = Cover(n - 1) + Cover(n - 2)Cover(n)=Cover(n1)+Cover(n2)

通过经验,越是这种题目,越有规律可循,而且代码量往往很少,最重要的是找到规律。

本题目核心当n>2n > 2n>2后,矩形的覆盖数就是一个2×12\times12×1的矩形和两个2×12\times12×1矩形“平躺” 这两种类型的矩形的排列组合数。

代码实现

class Solution {
public:
    int rectCover(int number) {
        if(number == 0)
            return 0;
        if(number == 1)
            return 1;
        if(number == 2)
            return 2;
        return rectCover(number - 1) + rectCover(number - 2);
    }
};

此题目代码不难,就不展示非递归的代码了,要学会多总结题目规律。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值