5I - 汉诺塔IV

还记得汉诺塔III吗?他的规则是这样的:不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出),也不允许大盘放到小盘的上面。xhd在想如果我们允许最大的盘子放到最上面会怎么样呢?(只允许最大的放在最上面)当然最后需要的结果是盘子从小到大排在最右边。 

Input

输入数据的第一行是一个数据T,表示有T组数据。 
每组数据有一个正整数n(1 <= n <= 20),表示有n个盘子。 

Output

对于每组输入数据,最少需要的摆放次数。 

Sample Input

2
1
10

Sample Output

2
19684

// 几乎能独立写出来了
 1 #include<stdio.h>
 2 /*    从左到右分别记柱子为a,b,c.
 3     #1将前n-1个盘子从a移到b.
 4     将第n个盘子从a移到b,再从b移到c.
 5     将前n-1个盘子从b移到c.
 6     则g(n)=2*f(n-1)+2.
 7     #2将前n-1个盘子从a移到b,再从b移到c.
 8     将第n个盘子从a移到b.
 9     将前n-1个盘子从c移到b.
10     则f(n)=3*f(n-1)+1.
11 */
12 int f[21]={0};
13 void table()
14 {
15     for(int i=1;i<21;i++)
16         f[i]=3*f[i-1]+1;
17 }
18 int main()
19 {
20     int t,n;
21     table();
22     scanf("%d", &t);
23     while(t--)
24     {
25         scanf("%d", &n);
26         printf("%d\n", 2*f[n-1]+2);
27     }
28     return 0;
29 } 
View Code

 

posted @ 2019-02-08 01:36  Blind  阅读(412)  评论(0编辑  收藏  举报