1 仔细分析题目可得到当反射次数为奇数时光想从上面射出,
2 当反射次数为偶数时光线从下面射出。所以分奇数和偶数
3 两种情况考虑。
4 奇数:每个面的光线数目等于本平面上个反射点的光线数目;
5 偶数:每个面的光线树木等于本平面下面的那个反射点的数目;
6 所以有递推关系式可以得到L[i][j] += L[i-1][k];表示i个光线
7 反射的线路数目。
8 #include<stdio.h>
9 #include<string.h>
10
11 long long L[60][4], sum;
12 int main()
13 {
14 int i, j, k, n;
15 memset(L, 0L, sizeof(L));
16 L[0][0] = 1L;
17
18 for(i=1; i<=60; i++)
19 for(j=0; j<=3; j++)
20 {
21 if(i%2 == 1)
22 {
23 for(k=0; k<j; k++)
24 L[i][j] += L[i-1][k];
25 }
26 else
27 {
28 for(k=j+1; k<=3; k++)
29 L[i][j] += L[i-1][k];
30 }
31 }
32 while(scanf("%d", &n) != EOF)
33 {
34 sum = 0;
35 for(i=0; i<3; i++)
36 sum += L[n][i+n%2];
37 printf("%lld\n", sum);
38 }
39 return 0;
40 }