贴瓷砖问题

Posted brickert

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了贴瓷砖问题相关的知识,希望对你有一定的参考价值。

问题描述:

  现有2*n的地板,1*1的地砖,2*1的地砖,请问将地板铺满共有多少种铺法?

 

思路:

  第一步,算出只用2*1的地砖铺满房间的数量;第二步,用1*1的地砖替换2*1的地砖,排列组合的总数乘以第一步中的数量。

 

解法:

第一步:

  n=1时,f(1)=1

  n=2时,f(2)=2

  当n=3时,进行分析,第一款砖若是竖着放,则剩下一个2*2的空间,问题转化为n=2;第一块砖若是横着放,则第二块砖的位置也固定了,剩下一个2*1的空间,问题转化为n=1,所以可得f(3)=f(2)+f(1)

  当n=4时,同上分析,第一块若竖着放,则剩下一个2*3的空间,方法为n=3的方法数;第一块砖若横着放,则第二块砖的位置也固定了,剩下一个2*2的空间,问题转化为n=2,所以可得f(4)=f(3)+f(2)

  符合斐波那契数列

  f(n)=f(n-1) + f(n-2)

double FibonacciSqe(int n)
{  
    double dR = sqrt(5);
    double res = 0;
    if(n > 1)
    {
        res = 1/dR * (pow(((1+dR)/2),n) - pow(((1-dR)/2),n)) + 1;
    }
    else
    {
        res = 1/dR * (pow(((1+dR)/2),n) - pow(((1-dR)/2),n));
    }   
    
    return res;
}

  FibonacciSqe(n)返回f(n)的值,代表只用2*1的地砖铺满地板需要的数量;

 

第二步:

  设A为1*1的地砖,B为2*1的地砖;

  用A替换B,在n块B中选出x块B,作为被替换目标。x取值范围:1~n;

  x=1时,选出C11块,Sum(1)=1,即B被替换有1种选法

  x=2时,选出C20+C21+C22块,Sum(2)=4,即B被替换有4种选法

  x=3时,选出C30+C31+C32+C33块,Sum(3)=8,即B被替换有8种选法

  ......

   x=n时,Sum(n)= Cn0+Cn1+Cn2+...+Cnn-1+Cnn = 2^n,即B被替换有2^n种选法

 

  所以总铺法 = 只用B铺的方法数量F(n)=FibonacciSqe(n)  乘以  A替换B的排列组合数量Sum(n);

  即,

    result=F(n)*Sum(n)

  这里要考虑特殊情况:x=n时,B全部被A替换,此时只有1种铺法,所以不能计入乘数,要用Sum(n)-1,且最后加上一种全部铺A的铺法

  即,

    result=F(n)*(2^n - 1) + 1

 

参考:https://blog.csdn.net/zyn2609530/article/details/51898572

以上是关于贴瓷砖问题的主要内容,如果未能解决你的问题,请参考以下文章

SpriteKit 瓷砖地图不加载瓷砖

noip模拟赛 铺瓷砖

Mapbox - 无效的瓷砖顺序

磁砖样式

WP 8.1 RT 的大图块变灰;较小的瓷砖看起来不错

踢脚线用木头的好还是瓷砖的好