C++第13周專案3——漢諾塔
阿新 • • 發佈:2019-02-07
【專案3-漢諾塔】
漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。古代有一個梵塔,塔內有三個座A、B、C,A座上有64個盤子,盤子大小不等,大的在下,小的在上。有一個和尚想把這64個盤子從A座移到C座,但每次只能允許移動一個盤子,並且在移動過程中,3個座上的盤子始終保持大盤在下,小盤在上。在移動過程中可以利用B座,下面左圖給出了移動方法的提示。請編制遞迴函式輸出盤子數為4時(程式除錯後,試試15個、20個,直至64個,看看會如何),移動的方案。下圖為盤子數為3時的輸出供參考。
#include <iostream> using namespace std; const int discCount=3; void move(int, char, char,char); int main() { move(discCount,'A','B','C'); return 0; } void move(int n, char A, char B,char C) { if(n==1) { cout<<A<<"-->"<<C<<endl; return; } else { move(n-1,A,C,B); cout<<A<<"-->"<<C<<endl; move(n-1,B,A,C); return; } }
【專案3擴充套件】如果要求出盤子移動的次數呢?請改寫程式。
參考解答:
//僅計數 #include <iostream> using namespace std; const int discCount=3; long move(int, char, char,char); int main() { long count; count=move(discCount,'A','B','C'); cout<<discCount<<"個盤子需要移動"<<count<<"次。"<<endl; return 0; } long move(int n, char A, char B,char C) { long c1,c2; if(n==1) { return 1; } else { c1=move(n-1,A,C,B); c2=move(n-1,B,A,C); return c1+c2+1; } }
//輸出且計數 #include <iostream> using namespace std; const int discCount=3; long move(int, char, char,char); int main() { long count; count=move(discCount,'A','B','C'); cout<<discCount<<"個盤子需要移動"<<count<<"次。"<<endl; return 0; } long move(int n, char A, char B,char C) { long c1,c2; if(n==1) { cout<<A<<"-->"<<C<<endl; return 1; } else { c1=move(n-1,A,C,B); cout<<A<<"-->"<<C<<endl; c2=move(n-1,B,A,C); return c1+c2+1; } }