原题:http://poj.org/problem?id=1958
把汉诺塔问题拓展为4根,递归方法题目已经给出。天呐,我竟然理解错题意了,wa了好几次,要哭了。
#include<cstdio>
const int M=0x7fffffff;
int dp[13]={0};//记录移动n根从A->D的最小步骤
int three(int n)
{
if(n==0)
{
return 0;
}else if(n==1)
{
return 1;
}else{
int now=0;
now=three(n-1);
now++;
now=now+three(n-1);
return now;
}
}
int four(int n)
{
if(dp[n]!=0)
{
return dp[n];
}
if(n==0)
{
return 0;
}
if(n==1)
{
return 1;
}
int min=M;
for(int i=1;i<=n;i++)
{
int ans=0;
ans=four(n-i);
ans=ans+three(i);
ans=ans+four(n-i);
if(min>ans)
{
min=ans;
}
}
return min;
}
int main()
{
for(int i=1;i<=12;i++)
{
int min=M;
for(int k=1;k<=i;k++)
{
int now=four(i-k); //第一步要移动i-k到B
now=now+three(k); //把k移动到D
now=now+four(i-k);//把B上的i-k 移动回D
if(now<min)
{
min=now;
}
}
dp[i]=min;
printf("%d\n",min);
}
return 0;
}