問題
漢諾塔:漢諾塔(Tower of Hanoi)源於印度傳說中,大梵天創造世界時造了三根金鋼石柱子,其中一根柱子自底向上疊着64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。 --引用維基百科
解析
對漢諾塔問題進行解釋和建立模型
這是示意圖,a是起始柱,c是目標柱,b起到中轉作用在進行轉移操作時,都必須確保大盤在小盤下面,且每次只能移動一個圓盤,最終c柱上有所有的盤子且也是從上到下按從小到大的順序。
關鍵:
對於這個漢諾塔問題,在寫遞歸時,我們只需要確定兩個條件:
-
1.遞歸何時結束?
-
2.遞歸的核心公式是什麼?即:
怎樣將n個盤子全部移動到C柱上?
即:若使n個盤子全部移動到C柱上,上一步應該做什麼?
- 當只有一個盤子,將它從a移動到c上
- 把a上面n-1的盤子看做整體,藉助c移動到b上
把a的最後一個盤子移到c上
把b上n-1個盤子藉助a移動到c上
代碼
#include <iostream>
using namespace std;
int sum=0; //記錄操作步驟次數
//將最左盤移動到最右盤
void move(char left, char right)
{
cout << left << "-->" << right << endl;
}
//n個盤子,將lef的盤子藉助mi盤,移動到righ盤
void hanoi(int n, char lef, char mi, char righ)
{
++sum;
if (n == 1)
{
cout << lef << "-->" << righ << endl;
}
else
{
hanoi(n - 1, lef, righ, mi);
move(lef, righ);
hanoi(n - 1, mi, lef, righ);
}
}
int main()
{
int n;
cout << "Input n = ";
cin >> n;
cout << "The steps to move " << n << " desks:" << endl;
hanoi(3, 'A', 'B', 'C');
cout << "The sum of the steps is " << sum << endl;
return 0;
}
參考結果
本部分代碼已上傳github:https://github.com/ShuaiWang-Code/c-/tree/master/Hanoi