1. 程式人生 > >習題3.10 漢諾塔的非遞歸實現(25 分)浙大版《數據結構(第2版)》題目集

習題3.10 漢諾塔的非遞歸實現(25 分)浙大版《數據結構(第2版)》題目集

-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版)》題目集