HDU 1143 Tri Tiling 递归问题
将一个3*n的矩形用1*2的矩形填充,n为奇数时一定不能被填满,n*3%2==1
接下来处理这个问题我们要从简单的情况开始考虑,所谓递归就是要能将问题的规模不断减小,通过小问题的解决最后将复杂问题解决。如果是3*2的情况仅有3种可能
那么我们来考虑3*4的矩形是否一些就是有这两个3*2的矩形拼接在一起的多种组合,当然还包含一种特殊的情况即如下图所示的拼接方法
把 4, 6, 8.... 看成一整块,就有下图两种情况(正着,倒着)
那么我们可以将其排成的各种情况分成如下两大类
由自身单独构成的矩形(即不可以分割)
可以分割的情况,即2*f(n-2i)(此时2i>2)/3*f(n-2i)(此时2i==2)
如图所示
代码如下:
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int till(int n) 5 { 6 int s,i; 7 if(n!=2) 8 { 9 s=2; 10 } 11 else 12 return 3; 13 for(i=2;i<n;) 14 { 15 if(i==2) 16 s=s+3*till(n-i); 17 else 18 s=s+2*till(n-i); 19 i=i+2; 20 } 21 return s; 22 } 23 int main() 24 { 25 int n; 26 while(cin>>n) 27 { 28 if(n==-1) 29 break; 30 if(n%2==1) 31 cout<<0<<endl; 32 else if(n==0) 33 cout<<1<<endl; 34 else 35 cout<<till(n)<<endl; 36 } 37 return 0; 38 }