【資料結構與演算法】遞迴漢諾塔
阿新 • • 發佈:2019-01-04
漢諾塔
漢諾塔是根據一個傳說形成的數學問題(關於漢諾塔):有三根杆子A,B,C。A杆上有N個(N>1)穿孔圓盤,盤的尺寸由下到上依次變小。要求按下列規則將所有圓盤移至C杆:
每次只能移動一個圓盤;
大盤不能疊在小盤上面。
提示:可將圓盤臨時置於B杆,也可將從A杆移出的圓盤重新移回A杆,但都必須遵循上述兩條規則。
遞迴漢諾塔
解題思路: 可以把問題簡化成2個盤子的情況,如:A上有兩個盤子,B和C是空的。如果要把A的兩個盤子全部移動到C,需要經過以下步驟:1.A移動一個盤子到B
2.A移動一個盤子到C
3.B移動一個盤子到C
到這裡已經把所有盤子移動到C盤,其實可以把底盤上面的盤子看成一個整體,這就簡化成3步了,然後使用遞迴重複這3個步驟就完成了所有盤子的位移。 使用遞迴解漢諾塔,並實時列印每一步的變化和計算步數。
#include #include std::string ga ("987654321"); std::string gb (""); std::string gc (""); // 步數(最少移動2^n - 1次才能完成。) static int step = 0; FILE* file = NULL; // count是盤子的數量 void han(int count, std::string &a, std::string &b, std::string &c){ if (count < 1) { return; } // A --> B han(count-1, a, c, b); //遞迴的一個特點:每一個步驟都依賴上一個步驟的結果。 // A --> C c.append(1,*(a.end()-1)); a.erase(a.end()-1); // 計數 ++step; // 實時列印a、b、c的變化 std::cout<<"a = "< C han(count-1, b, a, c); } void main(){ file = fopen("han.txt","w"); std::cout<<"a = "<