\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...