题目
解出n个盘子4座塔的Hanoi(汉诺塔)问题最少需要多少步?直接输出1<=n<=12的答案
题解
对于n个盘子3座塔的汉诺塔问题,设d[n]表示解出n个盘子3座塔的最小步数,有d[n]=2*d[n-1]+1,即把前n-1个盘子从A柱移动到B柱(用了d[n-1]步),然后把第n个盘子从A柱移动到C柱(用了1步),最后把前n-1个盘子从B柱移动到C柱(用了d[n-1]步)。
对于4塔问题的解题思路类似。设f[n]表示求解n盘4塔问题的最小步数,有
f[n]=min2∗f[i]+d[n−i]1<=i<n
f
[
n
]
=
m
i
n
2
∗
f
[
i
]
+
d
[
n
−
i
]
1
<=
i
<
n
即先把i个盘子在4塔模式下移动到B柱(用了f[i]步),然后把A柱上剩下的n-i个盘子在3塔模式下移动到D柱(用了d[n-i]步),最后把B柱上的i个盘子在4塔模式下移动到D柱(用了f[i]步)。枚举所有可能的i并取最小值可得出答案。
上述做法可推广到n盘m塔的计算
代码
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int d[15],f[15];
int main(){
d[1]=1;
for (int i=2;i<=12;i++)
d[i]=2*d[i-1]+1;
memset(f,0x3f,sizeof(f));
f[1]=1;
for (int i=2;i<=12;i++)
for (int j=1;j<=i;j++)
f[i]=min(f[i],2*f[j]+d[i-j]);
for (int i=1;i<=12;i++)
printf("%d\n",f[i]);
}