9107 Hanoi雙塔問題 NOIP2007

2022-05-22 05:18:10 字數 1508 閱讀 5756

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 三根細柱上的圓盤都要保持上小下大的順序...