習題3.10 漢諾塔的非遞歸實現(25 分)浙大版《數據結構(第2版)》題目集
阿新 • • 發佈:2017-10-05
-i pro 數據結構 但是 int 遞歸實現 記錄 表達 names
借助堆棧以非遞歸(循環)方式求解漢諾塔的問題(n, a, b, c),即將N個盤子從起始柱(標記為“a”)通過借助柱(標記為“b”)移動到目標柱(標記為“c”),並保證每個移動符合漢諾塔問題的要求。
輸入格式:
輸入為一個正整數N,即起始柱上的盤數。
輸出格式:
每個操作(移動)占一行,按柱1 -> 柱2
的格式輸出。
輸入樣例:
3
輸出樣例:
a -> c a -> b c -> b a -> c b -> a b -> c a -> c
額第一次寫漢諾塔,雖然聽強哥講過,但是一直沒試過,上來是懵逼的,所以先嘗試遞歸方式,寫對了,然後感覺非遞歸還是懵逼,想起之前嘗試的非遞歸樹的遍歷了,反正是用棧,仔細想過之後,其實就是當成結點對待就好了,從後往前倒著來,假設前n-1個已經放好從a到b,再把剩下的一個從a到c再從b到c,只要代號不是1,就出棧,並把它的第三個和第二個操作入棧,如果代號是1,就輸出。、
可能沒表達清楚,看代碼,輸出都是a->c輸出的,abc並非對應‘a‘,‘b‘,‘c‘,只是方便記錄。
代碼:
#include <iostream> #include <map> #include<algorithm> #include <stack> using namespace std; class abc { public: int d; char a, b, c; abc(char x,char y,char z,int s): a(x),b(y),c(z),d(s){} }; void hanio(int n,char a,char b,char c) { if(n == 1) { cout<<a<<" -> "<<c<<endl;return ; } hanio(n-1,a,c,b); hanio(1,a,b,c); hanio(n-1,b,a,c); } int main() { int n; cin>>n; abc temp(‘a‘,‘b‘,‘c‘,n); stack <abc> q; temp.d = n,temp.a = ‘a‘,temp.b = ‘b‘,temp.c = ‘c‘; q.push(temp); while(!q.empty()) { temp = q.top(); q.pop(); if(temp.d == 1)printf("%c -> %c\n",temp.a,temp.c); else { q.push(abc(temp.b,temp.a,temp.c,temp.d - 1)); q.push(abc(temp.a,temp.b,temp.c,1)); q.push(abc(temp.a,temp.c,temp.b,temp.d - 1)); } } // cout<<endl; // hanio(n,‘a‘,‘b‘,‘c‘); }
習題3.10 漢諾塔的非遞歸實現(25 分)浙大版《數據結構(第2版)》題目集