题目描述
解出 n n 个盘子 座塔的 Hanoi H a n o i (汉诺塔)问题最少需要多少步?
算法分析
回顾一下 3 3 座塔的汉诺塔问题:。
先将 n−1 n − 1 个盘子从 A A 柱移动到 柱,再将第 n n 个盘子从 柱移到 C C 柱,最后再将 个盘子从 B B 柱移动到 柱。
那么 4 4 座塔的汉诺塔问题:。
先将 n−i n − i 个盘子在能够使用 4 4 柱的模式下全部移动到 柱或 C C 柱中的一个上,此时剩下 柱,再将余下的 i i 个盘子在 柱模式下移动到 D D 柱,最后将 柱或 C C 柱上的 个盘子移到 D D <script type="math/tex" id="MathJax-Element-119">D</script> 柱。
代码实现
#include <cstdio>
#include <algorithm>
int f[15],g[15];
int main() {
f[1]=1;
for(int i=2;i<=12;++i) f[i]=2*f[i-1]+1;
g[1]=1;
for(int i=2;i<=12;++i) {
int cur=0x3f3f3f3f;
for(int j=1;j<i;++j) cur=std::min(cur,2*g[i-j]+f[j]);
g[i]=cur;
}
for(int i=1;i<=12;++i) printf("%d\n",g[i]);
return 0;
}