http://acm.cs.ecnu.edu.cn/problem.php?problemid=1820
汉诺塔变形:每步都得顺时针。(下图为逆时针)。
记 f[n] 为 把n个盘从 s->t 不经中间节点。如(A->B, B->C, C->A)
记 g[n] 为 把n个盘从 s->t 经中间节点。如(A->C, B->A, C->B)
分析见下图:
1 #include <stdio.h> 2 3 int main() 4 { 5 unsigned long long f[45], g[45]; 6 f[1] = 1, g[1] = 2; 7 for(int i=2; i<45; i++) 8 { 9 f[i] = 2*g[i-1] + 1; 10 g[i] = 2*g[i-1] + f[i-1] + 2; 11 } 12 int n; 13 while(scanf("%d", &n) != EOF) 14 printf("%llu ", f[n]); 15 }