Tri Tiling(递归)
Description
In how many wayscan you tile a 3xn rectangle with 2x1 dominoes? Here is a sample tiling of a3x12 rectangle.
Input
Input consistsof several test cases followed by a line containing -1. Each test case is aline containing an integer 0 ≤ n ≤ 30.
Output
For each testcase, output one integer number giving the number of possible tilings.
Sample Input
2
8
12
-1
Sample Output
3
153
2131
1分析大概题意;该题为骨牌题目的提升版;将空间的2行×n列变成3行×n列;然后用2×1的牌去摆;求其有n个列时的种类;
2特别重要的一点是;摆骨牌时不能有空余的地方则可以得出测试数据会是偶数而不会是奇数,因为如果是奇数的话则会出现空余的地方导致骨牌没摆全;还有一点就是当n=0时的特殊情况,实际情况下不会出现列数为0的情况,但我们需要将n=0是的情况设为1;因为不能有奇数的出现则只能将0相当于n=1时的一种不成立的情况拿进来;是的f(0)=1;
3说请了特别问题和题意后再让我们来找出递归吧;
递归关系;了解过递归的都知道,递归都是从f(n)开始找出f(n)与前面f(n-------)等许多的关系;列如普通的骨牌问题的递归关系就是f(n)=f(n-1)+f(n-2);同理这道题目我们也从这里入手;
因为n只能为偶数则直接考虑f(n-2);则多了2列出来;可以得出多了3种情况;(1,3个都是横的 2,上面摆一个横的下面两个竖的 3,下面摆一个横的上面两个竖的)
在分析f(n-4);则多出了4列并且不能与2列的情况重合则只有两种情况这是一个难点;现在来分析(1;下面4格摆两个横的中间四格摆两个横的旁边的刚好摆列的则铺满了2;上面4格摆两个横的中间四格摆两个横的旁边的刚好摆列的则铺满了)并且都没有与2列的情况重复;
再分析f(n-6);则多出6列按照f(n-4)的情况也只有两种;只需把中间的两横变成四横就OK了
f(n) = 3 * f( n - 2 ) + 2 * ( f ( n - 4 ) + f ( n - 6 ) + ... + f(0) ) ...................1
f (n - 2 ) = 3 * f ( n - 4 ) + 2 * ( f ( n - 6 ) + ... + f(0) )..........................2
得 :
f ( n ) = 4 * f ( n - 2 ) - f ( n - 4)
递归的边界问题;
F(0)=1;f(2)=3;
说了这么多应该明白了吧;开始敲代码吧;哈哈‘
#include<stdio.h>
int main()
{
long int mm[32]={0}, a, i;
mm[0] = 1;//为了递推公式而设的;实际不会存在这种情况;
mm[2] = 3;
for(i = 4; i < 32; i = i+2){
mm[i]=4*mm[i-2]-mm[i-4];//=======f(n)-f(n-2) ;
}
while(scanf("%ld",&a) != EOF && a != -1){
printf("%ld\n",mm[a]);
}
return 0 ;
}