Hanoi 雙塔問題

2021-10-09 00:02:19 字數 2033 閱讀 7813

\operatorname

luogup

1096

給定 a

aa 、 b

bb 、 c

cc 三根足夠長的細柱,在 a

aa 柱上放有 2n2n

2n個中間有孔的圓盤,共有 n

nn 個不同的尺寸,每個尺寸都有兩個相同的圓盤,注意這兩個圓盤是不加區分的(下圖為 n=3

n=3n=

3 的情形)。

現要將這些圓盤移到 c

cc 柱上,在移動過程中可放在 b

bb 柱上暫存。要求:

(1)每次只能移動乙個圓盤;

(2) a

aa 、 b

bb 、 c

cc 三根細柱上的圓盤都要保持上小下大的順序;

任務:設 a

na_n

an​ 為 2n2n

2n個圓盤完成上述任務所需的最少移動次數,對於輸入的 n

nn ,輸出 a

na_n

an​ 。

乙個正整數 n

nn ,表示在 a

aa 柱上放有 2n2n

2n個圓盤。

乙個正整數, 為完成上述任務所需的最少移動次數 a

na_n

an​ 。

1
2
2
6
對於 50

%50\%

50% 的資料, 1≤n

≤251 \le n \le 25

1≤n≤25

對於 100

%100\%

100%

的資料, 1≤n

≤200

1 \le n \le 200

1≤n≤20

0設法建立 a

na_n

an​ 與 an−

1a_an−1

​ 的遞推關係式。

這道題就是普通 dp 加普通高精。

我們可以知道,漢諾塔就是 f[i

]=f[

i−1]

∗2+1

f[i] = f[i - 1] * 2 + 1

f[i]=f

[i−1

]∗2+

1 ,那每個地方多了乙個相同的圓盤,那其實可以把這兩個圓盤看成乙個,然後原來的移動一次就是這裡的移動兩次。(因為兩個盤子都要移動)

那就是在輸出之前在把答案乘二再輸出。

(不會吧不會吧,不會真有人不知道要用高精吧)

#include

#define ll long long

using

namespace std;

ll n, f[

201]

[10001

], ans[

10001];

intmain()

while

(f[i]

[f[i][0

]+1]

)}ans[0]

= f[n][0

];//高精乘2

for(

int j =

1; j <= ans[0]

; j++

) ans[j]

= f[n]

[j]*2;

for(

int j =

1; j <= ans[0]

; j++

)while

(ans[ans[0]

+1])

for(

int i = ans[0]

; i >=

1; i--

)//輸出

printf

("%d"

, ans[i]);

return0;

}

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

vijos P1354 Hanoi雙塔問題

題意 求n個碟子在三柱漢諾塔上的移動次數。思路 公式 移動次數 2 碟子數 1 注意點 n在1 200範圍內,用大數問題處理。以下為ac 評測狀態 accepted 題目p1354 hanoi雙塔問題 遞交時間 2014 11 07 12 58 47 語言 c 評測機 上海紅茶館 消耗時間 45 m...