漢諾塔:
有三根桿子A,B,C。A桿上有N個(N>1)穿孔圓環,盤的尺寸由下到上依次變小。要求按下列規則將所有圓盤移至C桿:
- 每次只能移動一個圓盤;
- 大盤不能疊在小盤上面。
提示:可將圓盤臨時置於B桿,也可將從A桿移出的圓盤重新移回A桿,但都必須遵循上述兩條規則。
問:如何移?最少要移動多少次?
為了解決這個問題,不妨假設已經知道怎樣移動N-1個圓環了。現在,為了把起點盤上的圓環移動到目標盤,需要做如下操作:
1、把N-1個圓環從起點盤移動到(當前)沒有任何圓環的過度盤;
2、把最后一個圓環從起點盤移動到目標盤;
3、把N-1個圓環從國度盤移動到目標盤(模仿1和2的操作方法來實現)。
參考圖:
三個圓盤的漢諾塔
四個圓盤的漢塔:
C++實現漢諾塔算法的程序:
#include <iostream> #include <cstdio> using namespace std; void hannoi (int n, char A, char B, char C) // 把A盤里面的圓圈轉移到C盤里面【A--C】。 { if (n == 1) { cout << "移動圓圈" << n << "從盤" << A << "盤" << C << endl; //把最后一個圓環從起點盤移動到目標盤。 } else { hannoi (n-1, A, C, B); // 把N-1個圓環從起點盤移動到(當前)沒有任何圓環的過度盤;通過B、C盤在此函數調用中調用位置的互換,來實現把N-1個圓環從A盤到B盤的轉移【A--B】。 cout << "移動圓圈" << n << "從盤" << A << "盤" << C << endl; hannoi (n-1, B, A, C); // 把N-1個圓環從國度盤移動到目標盤(模仿1和2的操作方法來實現);通過A、B盤在此函數調用中位置的互換,來實現N-1個圓環從B盤到C盤的轉移【B--C】。 } } int main() { int n; cin >> n;
hannoi (n, 'a', 'b', 'c');
system("pause"); return 0; }