100層漢諾塔問題
阿新 • • 發佈:2018-11-12
輸入層數,能快速得到移動的次數,層數在10層以下可以得到移動的步驟。
#include<stdio.h> #define ll long long #define Cnum 10000000 ll res[5]={0}; int tot=0,c=0; void get_res(int n){ int i; ll adw=0; res[tot]=1; //計算2^n while(n--){ for(i=0;i<=tot;i++){ res[i]=res[i]*2+adw; adw=res[i]/Cnum;res[i]%=Cnum; if(tot==i&&adw)tot++; } } i=0; //減去1 while(!res[i]) i++; res[i]--; if(i!=0) while(i--) res[i]=Cnum-1;//若需借位 } void move(int disk,char start,char end) { printf("step:%d,move %c to %c\n",++c,start,end); return; } void hanoi(int n,char A,int B,char C) { if(n<=10) { if(n==1) move(1,A,C);//disk=1時,直接將disk從A移動到C else { hanoi(n-1,A,C,B);//第一步,將n-1個盤從A移動到B,其中C為輔助盤 move(n,A,C);//第二步,將n號盤直接從A移動到C hanoi(n-1,B,A,C);//第三步,將B盤上的n-1個盤遞迴呼叫 } } } int main_1(int n){ int i; get_res(n);//獲得結果 while(!res[tot]) tot--;//去掉首位 0 printf("%ld",res[tot]);//輸出首位 for(i=tot-1;i>=0;i--) printf("%07ld", res[i]);//按每7位輸出 不足補0 printf("\n"); return 0; } int main() { int disk_num; printf("input diak_num:\n"); scanf("%d",&disk_num); //移動。 hanoi(disk_num,'A','B','C'); //計算移動的次數。 printf("移動的次數為:"); main_1(disk_num); return 0; }