問題描述
設有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 }
個性簽名:時間會解決一切