矩形覆盖——js

    xiaoxiao2022-07-07  189

    矩形覆盖

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

    思路

    还是斐波那契数列。。。 当n=1的时候,只有一个2*1的矩形,所以只有一种方法,记为f(1)=1;当n=2的时候,是两个2*1的矩形,这时候具有两种方式去覆盖这个矩形了(这时候应该是一个正方形),一种是竖着放,一种是横着放,所以有两种方法,记为f(2)=2;

    当n=3的时候,仍然只能采用横着放或者竖着放的方式去覆盖这个矩形,我们仍首先考虑使用竖着放的方式,当竖着放的时候,由于已经覆盖了左边(假设是从左边开始覆盖的,从右边的覆盖的效果是一样的)一个2*1的矩形,所以还有2个2*1的矩形,而这种情况我们已经在n=2的时候计算出来了,就是f(2);接下来我们考虑横着放的情况,由于是横着放,在水平方向已经覆盖了一个2*1的矩形,所以要想覆盖这由3个2*1组成的矩形,只能在水平方向的覆盖的那个矩形下面继续覆盖一个,那么只剩下一个2*1的矩形了,这也通过前面的分析计算出来了,就是f(1)。综合以上分析,当n=3的时候,覆盖的方法是f(3)=f(1)+f(2)。

    2*1的大矩形和2*n的小矩形:

    第一次覆盖有两种情况:   横着覆盖:

    竖着覆盖:

    由此可得: 当第一次横着覆盖时,覆盖方法为f(n-2);当第一次竖着覆盖时,覆盖方法为f(n-1); 因此f(n)=f(n-1)+f(n-2); 当n=1时,只有1种覆盖方法,当n=2时,有2种覆盖方法。 此题最终得出的仍然是一个斐波那契数列。 n=1, f(n)=1 n=2, f(n)=2 n>2,且为整数, f(n)=f(n-1)+f(n-2)

    代码

    function rectCover(number) { // write code here if (number<0){ return -1; }else if(number <=2){ return number } var arr = []; arr[0] = 1; arr[1] = 2; for(var i = 2; i < number; i++) { arr[i] = arr[i - 1] + arr[i - 2]; } return arr[number-1]; }
    最新回复(0)