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 }

 

posted @ 2015-03-07 17:33  fancy_boy  阅读(278)  评论(0编辑  收藏  举报