Hanoi問題

n 階 Hanoi 塔問題假設有三個分別命名爲 X、Y 和 Z 的塔座,在塔座 X 上插有 n 個直徑大小各不相同、從小到大編號爲 1,2,...,n 的圓盤,以下圖所示。spa

圖. Hanoi 塔問題code

現要求將 X 塔上的 n 個圓盤移動到 Z 上並仍按一樣的順序疊放,圓盤移動時必須遵循下列規則:
• 每次只能移動一個圓盤;
• 圓盤能夠插在 X、Y 和 Z 中的任一塔座上;
• 任什麼時候刻都不能將一個較大的圓盤壓在較小的圓盤之上。blog

遞歸代碼以下:遞歸

 1 hanoi.c
 2 
 3 
 4 /*
 5 * @brief 將塔座 x 上按直徑有小到大且自上而下編號
 6 * 爲 1 至 n 的 n 個圓盤按規則搬到塔座 z 上,y 可用作輔助塔座.
 7 * @param[in] n 圓盤個數
 8 * @param[in] x 源塔座
 9 * @param[in] y 輔助塔座
10 * @param[in] z 目標塔座
11 * @return 無
12 * @note 無
13 * @remarks 無
14 */
15 void hanoi(int n, char x, char y, char z)
16 {
17   if(n == 1)
18 
19   {
20     /* 移動操做 move(x,n,z) 可定義爲(c 是初始值爲的全局變量,對搬動計數)
21       printf("%i. Move disk %i from %c to %c\n", ++c, n, x, z);
22     */
23     move(1, x, z); /* 將編號爲 1 的圓盤從 x 移動到 z */
24     return;
25   }
26 
27   else
28 
29   {
30     /* 將 x 上編號 1 至 n-1 的圓盤移到 y,z 做輔助塔 */
31     hanoi(n-1, x, z, y);
32     move(n,x,z); /* 將編號爲 n 的圓盤從 x 移到 z */
33     /* 將 y 上編號至 n-1 的圓盤移到 z,x 做輔助塔 */
34     hanoi(n-1, y, x, z);
35   }
36 }
相關文章
相關標籤/搜索