遞歸--練習2--noi6261漢諾塔
阿新 • • 發佈:2017-06-21
con using problem 練習 微秒 noi cout ram -1
遞歸--練習2--noi6261漢諾塔
一、心得
先把遞推公式寫出來,會很簡單的
二、題目
6261:漢諾塔問題
- 總時間限制:
- 1000ms
- 內存限制:
- 65536kB
- 描述
-
約19世紀末,在歐州的商店中出售一種智力玩具,在一塊銅板上有三根桿,最左邊的桿上自上而下、由小到大順序串著由64個圓盤構成的塔。目的是將最左邊桿上的盤全部移到中間的桿上,條件是一次只能移動一個盤,且不允許大盤放在小盤的上面。
這是一個著名的問題,幾乎所有的教材上都有這個問題。由於條件是一次只能移動一個盤,且不允許大盤放在小盤上面,所以64個盤的移動次數是:18,446,744,073,709,551,615
這是一個天文數字,若每一微秒可能計算(並不輸出)一次移動,那麽也需要幾乎一百萬年。我們僅能找出問題的解決方法並解決較小N值時的漢諾塔,但很難用計算機解決64層的漢諾塔。
假定圓盤從小到大編號為1, 2, ... - 輸入
- 輸入為一個整數後面跟三個單字符字符串。
整數為盤子的數目,後三個字符表示三個桿子的編號。 - 輸出
- 輸出每一步移動盤子的記錄。一次移動一行。
每次移動的記錄為例如 a->3->b 的形式,即把編號為3的盤子從a桿移至b桿。 - 樣例輸入
-
2 a b c
- 樣例輸出
-
a->1->c a->2->b c->1->b
三、AC代碼
1 /* 2 noi6261漢諾塔問題 3 Hanoi(n-1,a,c,b); 4 cout<<a<<"->"<<n<<"->"<<b<<endl;5 Hanoi(n-1,c,b,a); 6 邊界條件: 7 n==1 8 */ 9 #include <iostream> 10 using namespace std; 11 //將n個盤子從a經過c移動到b 12 void Hanoi(int n,char a,char b,char c){ 13 if(1==n) cout<<a<<"->"<<1<<"->"<<b<<endl; 14 else{ 15 Hanoi(n-1,a,c,b); 16 cout<<a<<"->"<<n<<"->"<<b<<endl; 17 Hanoi(n-1,c,b,a); 18 } 19 20 } 21 int main(){ 22 int n; 23 char a,b,c; 24 cin>>n>>a>>b>>c; 25 Hanoi(n,a,b,c); 26 return 0; 27 }
遞歸--練習2--noi6261漢諾塔