time limit: 10 second
memory limit: 2 mb
問題描述
給定a,b,c三根足夠長的細柱,在a柱上放有2n個中間有孔的圓盤,共有n個不同的尺寸,每個尺寸都有兩個相同的圓盤,注意這兩個圓盤是不加區分的。現要將這些圓盤移到c柱上,在移動過程中可放在b柱上暫存。要求:
(1)每次只能移動乙個圓盤;
(2) a、b、c三根細柱上的圓盤都要保持上小下大的順序;
任務:設an為2n個圓盤完成上述任務所需的最少移動次數,對於輸入的n,輸出an。
輸入為乙個正整數n,表示在a柱上放有2n個圓盤
輸出僅一行,包含乙個正整數,為完成上述任務所需的最少移動次數an。(最後用換行結束)
1
2
2
6【題解】
先不考慮有相同圓盤的情況。
即n個不同的圓盤。
則需要把n-1個圓盤從a->b,然後把a上剩餘的乙個圓盤從a->c。然後把b上的n-1個圓盤從b->c。
這裡的兩步:把n-1個圓盤從a->c,和n-1個圓盤從b->c.所需要的步驟數。實際上就是把n-1個圓盤從a移動到c的步驟數*2,因為是等價的。從a->b和從b->c移動的圓盤個數都是一樣的,這樣。
然後還要多一步就是把a上的乙個圓盤放到c。
所以得到遞推式。(沒有相同的圓盤。然後是n個不是2*n個的遞推式)
an表示把n個圓盤從a到c的步驟數。
an=a(n-1)*2+1;
然後玩一下數學遊戲。
an=a(n-1)*2+2-1;
an+1=a(n-1)*2+2;
an+1=2(a(n-1)+1)
令bn = (an+1);
則bn是乙個等比數列。
a1只有把1個圓盤從a移到c,步驟為1
b1=a1+1 = 2;
所以bn=2^n
然後an=2^n-1;
現在考慮有重複圓盤的情況。
其實只要乘上2就可以了。。
比如n==1.
a上有兩個相同的圓盤。那就全都拿到c就好了。
只不過要多移動一次了而已。
然後每種圓盤都要多移動一次
設dn為2*n個圓盤(n種)要從a移動到c的步驟數。
dn=2*an=2^(n+1)-2;
然後n可能很大。要用高精度。
寫一下高精度乘法即可。
【**】
//2^(n+1)-2;#include int n, a[1000] = ;//a陣列用來存高精度的各個位上的數字。
void input_data()
void get_ans()
while (x > 0) //可能要擴充套件位數。
}a[1] -= 2;//直接減去2就好。不會出現要退位的情況。
//因為2的x次方除了2的0次方之外。其他的個位數字上的數字都大於等於2.這樣。
}void output_ans()
int main()
Hanoi 雙塔問題
operatorname luogup 1096 給定 a aa b bb c cc 三根足夠長的細柱,在 a aa 柱上放有 2n2n 2n個中間有孔的圓盤,共有 n nn 個不同的尺寸,每個尺寸都有兩個相同的圓盤,注意這兩個圓盤是不加區分的 下圖為 n 3 n 3n 3 的情形 現要將這些圓盤移...
Hanoi雙塔問題(遞推)
時間限制 1 sec 記憶體限制 128 mb 提交 10 解決 4 提交 狀態 討論版 命題人 外部匯入 給定a,b,c三根足夠長的細柱,在a柱上放有2n個中間有空的圓盤,共有n個不同的尺寸,每個尺寸都有兩個相同的圓盤,注意這兩個圓盤是不加區分的 下圖為n 3的情形 現要將 這些國盤移到c柱上,在...
題解 Hanoi 雙塔問題
給定 a b c 三根足夠長的細柱,在 a 柱上放有 2n 個中間有孔的圓盤,共有 n 個不同的尺寸,每個尺寸都有兩個相同的圓盤,注意這兩個圓盤是不加區分的。現要將這些圓盤移到 c 柱上,在移動過程中可放在 b 柱上暫存。要求 每次只能移動乙個圓盤 a b c 三根細柱上的圓盤都要保持上小下大的順序...