HDU 2511二分+汉诺塔

问题描述:求n阶汉诺塔第x步移动策略

 

开始的时候以为是汉诺塔的递归模拟,然后果断超时了。由于汉诺塔步骤1和步骤3的操作数相同,所以这里用二分查找来加速。

n阶汉诺塔需要移动2^n-1次,所以mid=(2^n-1+1)/2=2^n-1,

当step>mid时,step-=mid,转化成n-1阶汉诺塔。

#include<stdio.h>

long long step,f[64];

void bsHanoi(int n,int a,int b,int c)
{
    long long mid=f[n-1];
    if(step==mid)
    {
        printf("%d %d %d\n",n,a,c);
        return ;
    }
    if(step<mid)
        bsHanoi(n-1,a,c,b);
    else
    {
        step-=mid;
        bsHanoi(n-1,b,a,c);
    }
        
}

int main()
{
    int i,t;
    for(i=1,f[0]=1;i<64;i++)
        f[i]=f[i-1]<<1;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d%I64d",&n,&step);
        bsHanoi(n,1,2,3);
    }
    return 0;    
}

递归汉诺塔模版:

void hannoi (int n, char A, char B, char C)    //A移动到C,借助B,
{
    if (n == 1)
    {
        cout << "Move disk " << n << " from " << A << " to " << C << endl;
 
    }
    else
    {
        hannoi (n-1, A, C, B);
        cout << "Move disk " << n << " from " << A << " to " << C << endl;
        hannoi (n-1, B, A, C);
    }
}
posted @ 2014-02-18 22:21  zhen94  阅读(285)  评论(0编辑  收藏  举报