[题目大意]:
在一个3*n(0 <= n <= 30.)的矩形中放置1*2的小矩形,有多少种完全放置的方法。
[输入]:
每一行一个测试数据n,输入-1结束.
[输出]:
对每一个测试数据,输出放置方法的种数.
Sample Input
2
8
12
-1
Sample Output
3
153
2131
在一个3*n(0 <= n <= 30.)的矩形中放置1*2的小矩形,有多少种完全放置的方法。
[输入]:
每一行一个测试数据n,输入-1结束.
[输出]:
对每一个测试数据,输出放置方法的种数.
Sample Input
2
8
12
-1
Sample Output
3
153
2131
s t s t
(1)将3×n矩形看作是是3×(n-2)矩形与3×2矩形构成,共有S(2)*S(n-2)种组合;
n-2 2
- (2)对于求总的组合数S(n),在(1)的基础上还要加上如下图的情形对应的组合数;
n-2 2
于是,又将上面这种3×n矩形看作是是3×(n-4)矩形与3×4矩形构成,减去与(1)重复的情形,如下图,共有2*S(n-4)种情形;
n-4 4
- (3)仿照以上步骤,将3×n矩形看作是是3×(n-m)矩形与3×m矩形(m为偶数)构成,减去与之前步骤重复的情形,如下图,
n-m m
对于上图的3×m矩形,考虑其相邻两个3×2矩形都有公共部分,只有两种情形。于是,,共有2*S(n-m)种情形;
- (4)写出递推式? 总组合数S(n)=S(2)*S(n-2)+2*(S(n-4)+S(n-6)+...+S(2)+S(0));
其中S(2)=3,由S(2)=3*S(0),知,S(0)=1;
代码如下:
#include <stdio.h>
int s(int n)
{
int i;
if (n == 0)
return 1;
else if (n == 2)
return 3;
else
{
int result = 3 * s(n-2);
for (i = n-4; i >= 0; i = i-2)
result += 2*s(i);
return result;
}
}
void main()
{
int n;
while(scanf("%d", &n) != EOF)
{
if (n == -1)
break;
else if ( n % 2 == 1)
printf("0\n");
else
printf("%d\n", s(n));
}
}