hdu 2064汉诺塔III 递推

汉诺塔递推题,比汉诺塔多了一个限制条件,盘子只允许在相邻的柱子之间移动。

分析:

第1步:初始状态;

第2步:把上面的n-1个盘移到第3号杆上;

 

第3步:把第n个盘从1移到2;

第4步:把前n-1个从3移到1,给第个盘让路;

第5步:把第n个盘从2移到3;

第6步:把前n-1个从移到3,完成移动;

我们设f(n)为把n个盘从1移到3所需要的步数,当然也等于从3移到1的步数。
看什么的图就知道,要想把第n个盘从1移到3,需要想把前n-1个从1移动3,再从3->1最后再1->3。
而第n个盘要从1->2->3经历2步。
∴f(n) = 3 × f(n-1) + 2;
  f(1) = 2;

#include<stdio.h>
int main()
{
    __int64 f[36],n,i;
    f[1]=2;
    for(i=2;i<=35;i++)
        f[i]=3*f[i-1]+2;
    while(scanf("%I64d",&n)!=EOF)
        printf("%I64d\n",f[n]);
    return 0;
}

 

 

posted @ 2014-03-01 18:57  xtaq  阅读(174)  评论(0编辑  收藏  举报