Hanoi双塔问题
Hanoi雙塔問(wèn)題
題目描述
?
給定A,B,C三根足夠長(zhǎng)的細(xì)柱,在A柱上放有2n個(gè)中間有空的圓盤(pán),共有n個(gè)不同的尺寸,每個(gè)尺寸都有兩個(gè)相同的圓盤(pán),注意這兩個(gè)圓盤(pán)是不加區(qū)分的(下圖為n=3的情形)。現(xiàn)要將 這些國(guó)盤(pán)移到C柱上,在移動(dòng)過(guò)程中可放在B柱上暫存。要求:
?
?
(1)每次只能移動(dòng)一個(gè)圓盤(pán);
?
(2) A、B、C三根細(xì)柱上的圓盤(pán)都要保持上小下大的順序;
?
任務(wù):設(shè)An為2n個(gè)圓盤(pán)完成上述任務(wù)所需的最少移動(dòng)次數(shù),對(duì)于輸入的n,輸出An。
?
?
輸入
?
輸入文件hanoi.in為一個(gè)正整數(shù)n,表示在A柱上放有2n個(gè)圓盤(pán)。
?
輸出
?
輸出文件hanoi.out僅一行,包含一個(gè)正整數(shù),為完成上述任務(wù)所需的最少移動(dòng)次數(shù)An。
?
樣例輸入
1樣例輸出
2提示
?對(duì)于50%的數(shù)據(jù),?1<=n<=25
對(duì)于100%?數(shù)據(jù),?1<=n<=200
?
設(shè)法建立An與An-1的遞推關(guān)系式。
1 #include<bits/stdc++.h> 2 using namespace std; 3 int f[1000],n; 4 void Hanoi() 5 { 6 int i; 7 for(i=1;i<=f[0];i++) f[i]*=2; //按位乘2 8 f[1]+=2; 9 for(int i=1;i<=f[0];i++) //處理進(jìn)位 10 { 11 f[i+1]+=f[i]/10; 12 f[i]%=10; 13 } 14 if(f[f[0]+1]!=0) f[0]++; //確定位數(shù) 15 } 16 int main() 17 { 18 cin>>n; 19 memset(f,0,sizeof(f)); 20 f[0]=1;f[1]=2; 21 for(int i=2;i<=n;i++) 22 { 23 Hanoi(); 24 } 25 for(int i=f[0];i>=1;i--) 26 cout<<f[i]; 27 cout<<endl; 28 return 0; 29 } View Code?
轉(zhuǎn)載于:https://www.cnblogs.com/qing123tian/p/11107540.html
總結(jié)
- 上一篇: linux下自定义命令的几种实现方法
- 下一篇: Django(模板语言-自定义filte