贴瓷砖问题
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
以上是关于贴瓷砖问题的主要内容,如果未能解决你的问题,请参考以下文章