主要是在做題中遇到的三柱漢諾塔及四柱漢諾塔問題得到的一些見解,記錄下來。(如有理解不對的地方請多多包涵)
(參考了大佬的**)
一、三柱漢諾塔
a、 b、 c
源位置、快取、目的位置
演算法:(1)將a上n-1個盤以c為快取,全部轉移到b柱上。 t(n-1)
(2)將a上第n個盤直接轉移到c柱上。 t(1)
(3)將b上n-1個盤以a為快取,全部轉移到c柱上。 t(n-1)(遞迴過程)
**:(1)需要輸出具體過程(遞迴)
#include void hanoi(int n,char x,char y,char z)
hanoi(n-1, x, z, y);
printf("%c-->%c\n",x,z);
hanoi(n-1, y, x, z);
}int main()
(2)直接輸出次數(迭代)
#include #define max 60
int main()
; //通常習慣提前計算出結果而不是在過程中進行迴圈,避免時間複雜度過高
for (i=1; i二、四柱漢諾塔
a、 b、 c、 d
源位置、快取、快取、目的位置
演算法:(並不是最優結果,而是仿照三柱的情況)
(1)將a上n-2個盤以c、d為快取,全部轉移到b柱上 t(n-2)
(2)將第n-1個盤轉移到c柱上. t(1)
(3)將第n個盤轉移到d柱上. t(1)
(4)將第n-1個盤移到d柱上. t(1)
(4)將b上n-2個盤以a、c為快取,全部轉移到d柱上.t(n-2)
**:(1)輸出過程(遞迴)
#include #include #define max 65
void move(char x,char y)
void hanoi_four(int n,char a,char b,char c,char d)
if (n==2)
hanoi_four(n-2, a, c, d, b);
move(a, c);
move(a, d);
move(c, d);
hanoi_four(n-2, b, a, c, d);
}int main()
(2)計算次數(迭代)
#include #define max 65
int main()
; int n,i;
for (i=1; i演算法2:最優演算法 frame演算法
(更多了解)
重點:不是將情況限制在n-2範圍裡,而是存在r,使移動步數最少
(1)用4柱漢諾塔演算法,將a上n-r的盤以c,d為快取,全部轉移到b柱上 t(n-r)
(2)用3柱漢諾塔演算法,將a上剩餘r個盤通過c柱轉移到d柱 2^r-1
(3)用4柱漢諾塔演算法,將b上n-r個盤以a,c為快取,全部轉移到d柱上. t(n-r)
如何確定r的取值?
type 1
根據漢諾塔的演算法計算出不同r下t(n)的取值,取最小值(1<=r<=n)
type 2
根據他人已經給出的證明,直接得到
因為r是整數,向下取整
再帶入t(n)計算公式
樣例:輸入n個數,輸出其移動次數
input:
output:
**:#include #include #define max 65
double r_size(int n)
double f_size(int n)
int main()
; int i;
for (i=0; i
int group,num;
scanf("%d",&group);
while (group--)
return 0;
}
漢諾塔的問題
參考 漢諾塔 漢諾塔 又稱河內塔 問題是源於印度乙個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片 圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定 在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動乙個圓盤。假...
XYNUOJ 問題 A 漢諾塔(一)
時間限制 1 sec 記憶體限制 64 mb 提交 8 解決 4 提交 狀態 討論版 在印度,有這麼乙個古老的傳說 在世界中心貝拿勒斯 在印度北部 的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天...
有趣的漢諾塔問題
乙個只能用遞迴的方法來解決的問題,問題描述 有三根標號為a,b,c的柱子,在a上放著64個金盤,每乙個都比下面的略小,現在需要把a柱上的盤子全部移到c柱上,移動的條件是 一次只能移動乙個金盤,移動過程中大金盤不能放在小金盤的上面 結題思路 設a柱上盤子總數為n,如果n 1,則將盤子從a移到c,否則執...