天天看點

漢諾塔(移動方案)

問題描述

設有3個分别命名為X、Y和Z的塔座,在塔座X上有n個直徑各不相同的盤片,從小到大一次編号為1、2、..n。現要求将X塔座上的這n個盤片移到塔座Z上并仍按同樣的順序疊放,盤片移動時必須遵守一下規則:每次隻能移動一片盤片;盤片可以插在X、Y和Z中的任一塔座上;任何時候都不能将一個較大的盤片放在較小的盤片上。

思路

采用遞歸求解。将n個盤片從X移到Y,等同于先将n-1個從X移到Z(從小到大疊放),然後将剩下的一個移動到Y,再将原來的n-1個從Y移到Z。

剩下的一個總是最大的,是以不會違反規則。最大的到達目的地後,可直接忽略掉,問題規模就減少1了。

代碼

1 #include<stdio.h>
 2 
 3 //表示将n個盤片從X塔座,借助Y塔座,移動到Z塔座
 4 void Hanoil(int n, char X, char Y, char Z)
 5 {
 6     if (n == 1)
 7         printf("\t将第%d個盤片從%c移動到%c\n", n, X, Z);
 8     else
 9     {
10         Hanoil(n - 1, X, Z, Y);
11         printf("\t将第%d個盤片從%c移動到%c\n", n, X, Z);
12         Hanoil(n - 1, Y, X, Z);
13     }
14 }
15 
16 int main()
17 {
18     int n;
19     char names[] = { 'X','Y','Z' };
20     printf("盤片的個數:");
21     scanf("%d", &n);
22     Hanoil(n, names[0], names[1], names[2]);
23 
24     return 0;
25 }      

個性簽名:時間會解決一切