1. 程式人生 > >3個塔漢羅塔最少移動次數

3個塔漢羅塔最少移動次數

最少次數是有規律的:有1號,2號,3號……盤從小到大   1.當只有一個盤時,移動到目標塔上時為2^0;   2.當有兩個盤時,1號盤移動到目標塔上時為2^(n-1);   3.有三個盤時,1號盤移動目標塔上時為2^(n-1);按此規律便可以得出有n盤時,1號,2號,3號……盤時移動到目標盤的最小次數2^(n-i);  
#include<cstdio>
#include<cmath>
using namespace std;
int t=0;
/*void movie()
{
    t++;
}
void hanio(int n,int k)
{
    if(n==k)
        movie();
    else
    {
        hanio(n-1,k);
        movie();
        hanio(n-1,k);
    }
}*/
int main()
{
   int n;
   scanf("%d",&n);
   while(n>0)
   {
     int  a,b;
       scanf("%d%d",&a,&b);

       if(a-b>30)
       {
           int ans=pow(2,30);       //int的表示最大範圍2^31
           int y[20]={0};           //用整型陣列來儲存大於2^31的數

           for(int i=19;i>=0;i--)
           {
               y[i]=ans%10;
               ans=ans/10;
               if(ans==0)break;
           }

           for(int i=a-b-30;i>=1;i--)   //i=n-31,迴圈i次可以得到2^n,n>31
           {
                int x[20]={0};
               for(int j=19;j>=0;j--)    //2^32=2^31*2;
               {
                   int res=y[j]*2+x[j];
                   y[j]=res%10;
                   if(res>=10)
                   {
                       x[j-1]=1;
                   }
               }

           }

           int c=0;
           for(int i=0;i<=19;i++)
           {
               if(y[i]!=0)
               {
                   c=i;
                   break;
               }
           }
           for(int i=c;i<=19;i++)
            printf("%d",y[i]);
           printf("\n");
       }else
       {
           int ans=pow(2,a-b);
           printf("%d\n",ans);
       }
       n--;
       //t=0;
   }
   return 0;
}