题意:
给你n个盘子,问在四个柱子的情况下,最少需要多少步才能将n个盘子移动到另一个柱子上。
思路:
先来看看最经典的三个柱子问题。
f3[i] = 2*f3[i-1]+1,即将(i-1)个盘子移动到中间那根柱子上,然后再将最后一个盘子移动到目标柱子上,最后将(i-1)个盘子移动到目标柱子上即可。
那么对于四根柱子的话,我们可以先将i个盘子移到B柱子上,然后再将剩下的盘子按照三根柱子的移法移到目标柱子上,然后B柱子上的i个盘子再按四根柱子的移法移动到目标柱子即可。
所以 f4[n] = min(2*f4[i]+f3[n-i])。
总结:
汉诺塔问题是典型的递推问题,此问题也可以拓展到m个柱子,n个盘子上,思路都是统一的进行递推。
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#define rep(i,a,b) for(int i = a; i <= b; i++)
using namespace std;
int f3[15],f4[15];
void init()
{
f3[1] = 1;
rep(i,2,12)
f3[i] = 2*f3[i-1]+1;
}
int main()
{
int n = 12;
init();
memset(f4,0x3f,sizeof f4);
f4[1] = 1;
rep(i,2,n)
{
rep(j,1,i-1)
{
f4[i] = min(f4[i],f4[j]+f3[i-j]+f4[j]);
}
}
rep(i,1,12)
printf("%d\n",f4[i]);
return 0;
}