【題目描述】
給定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三根細柱上的圓盤都...