easy高精度 Hanoi雙塔問題

2022-03-21 06:55:51 字數 1629 閱讀 4016

【題目描述】

給定a、b、c三根足夠長的細柱,在a柱上放有2n個中間有孔的圓盤,共有n個不同的尺寸,每個尺寸都有兩個相同的圓盤,注意這兩個圓盤是不加區分的(下圖為n=3的情形)。現要將這些圓盤移到c柱上,在移動過程中可放在b柱上暫存。要求:

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

(2)a、b、c三根細柱上的圓盤都要保持上小下大的順序;

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

【輸入格式】

乙個正整數n,表示在a柱上放有2n個圓盤。

【輸出格式】

僅一行,包含乙個正整數, 為完成上述任務所需的最少移動次數an。

【樣例輸入】

樣例輸入1

樣例輸入212

【樣例輸出】

樣例輸出1

樣例輸出226

【分析】

設f[n]為有2 * n個圓盤,所需移動的步數。

分三步:

將2 * n - 2個盤子移動到b,所用的步數是f[n – 1]

將最後的兩個移動到c上,所用步數是2

將2 * n - 2個盤子移動到c,所用的步數是f[n – 1]

那麼f[n] = 2 * f[n – 1] + 2;

f[n] + 2 = 2 * (f[n – 1] + 2);

f[n] = 2 ^ (n + 1) – 2;

然後就是高精度了。

#include #include #define maxlen 110

#define base 10000

int ans[maxlen],b[maxlen];

int n;

void cheng1(int a)

c[0] = a[0] * 2;

for (int i = 1;i <= c[0];++i)

while (c[c[0] + 1])

++c[0];

while ((!c[c[0]]) && (c[0] > 1))

--c[0];

for (int i = 0;i < maxlen;++i)

a[i] = c[i];

}void cheng2(int a)

while (c[c[0] + 1])

++c[0];

while ((!c[c[0]]) && (c[0] > 1))

--c[0];

for (int i = 0;i < maxlen;++i)

a[i] = c[i];

}void pow2(int x)

int main()

ans[1] -= 2;

} printf("%d",ans[ans[0]]);

for (int i = ans[0] - 1;i > 0;--i)

printf("%d%d%d%d",ans[i] / 1000,

ans[i] / 100 % 10,

ans[i] / 10 % 10,

ans[i] % 10);

return 0;

}

高精度之Hanoi雙塔問題

description 給定a b c三根足夠長的細柱,在a柱上放有2n個中間有孔的圓盤,共有n個不同的尺寸,每個尺寸都有兩個相同的圓盤,注意這兩個圓盤是不加區分的。現要將這些圓盤移到c柱上,在移動過程中可放在b柱上暫存。要求 1 每次只能移動乙個圓盤 2 a b c三根細柱上的圓盤都要保持上小下大...

高精度 P1096 Hanoi 雙塔問題

題目描述 給定a b c三根足夠長的細柱,在a柱上放有2n個中間有孔的圓盤,共有n個不同的尺寸,每個尺寸都有兩個相同的圓盤,注意這兩個圓盤是不加區分的 下圖為n 3的情形 現要將這些圓盤移到c柱上,在移動過程中可放在b柱上暫存。要求 1 每次只能移動乙個圓盤 2 a b c三根細柱上的圓盤都要保持上...

題解 Hanoi雙塔問題(高精度處理,壓4用20)

題目描述 給定a,b,c三根足夠長的細柱,在a柱上放有2n個中間有空的圓盤,共有n個不同的尺寸,每個尺寸都有兩個相同的圓盤,注意這兩個圓盤是不加區分的 下圖為n 3的情形 現要將 這些國盤移到c柱上,在移動過程中可放在b柱上暫存。要求 提交 1 每次只能移動乙個圓盤 2 a b c三根細柱上的圓盤都...