3個塔漢羅塔最少移動次數
阿新 • • 發佈:2019-01-31
最少次數是有規律的:有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; }