汉诺塔问题的递归解法与非递归解法(堆栈解法)

来源:互联网 发布:网络电视30天回看 编辑:程序博客网 时间:2024/06/10 04:15
1.递归算法,三步:移动n-1到b,移动1到c,移动n-1到c。
#include<iostream>using namespace std;int j = 1;void move(char a, char c){cout << j++ << " " << a << "--->" << c << endl;}void Hanio(int n,char a,char b,char c){if (n == 1){move(a, c);return;}Hanio(n - 1, a, c,b);move(a, c);Hanio(n - 1, b, a,c);}int main(){int n;cin >> n;cin.get();Hanio(n, 'a', 'b', 'c');cin.get();return 0;}


2.非递归解法,使用堆栈
主要是将问题分解为三个,从后向前压进堆栈,再依次解决
#include<iostream>using namespace std;const int Maxsize = 100;typedef struct {       //建立一个汉诺塔模型,n是盘个数,ABC是三个柱子int N;char A;char B;char C;}Mode;typedef struct {//建立一个堆栈Mode Data[Maxsize];int Top;}Stack;Mode ERROR;void Push(Stack * Ptr, Mode item)//压进堆栈{if (Ptr->Top == Maxsize - 1)return;else{Ptr->Data[++(Ptr->Top)] = item;return;}}Mode Pop(Stack * Ptr)//弹出堆栈{if (Ptr->Top == -1)return ERROR;else{Ptr->Top--;return Ptr->Data[Ptr->Top + 1];}}void Hanio(int n)//求汉诺塔解决子程序{Mode P, toPush;Stack S;P.N = n;//建立一个汉诺塔型 的结构体,n是盘数P.A = 'a';P.B = 'b';P.C = 'c';S.Top = -1;Push(&S, P);//(n,a,b,c)可以分解为三个问题(n-1,a,b,c)(2,a,b,c)(n-1,b,a,c),然后反着压进堆栈while (S.Top != -1)//看栈是不是空的{P = Pop(&S);if (P.N == 1)cout << P.A << "--->" << P.C;else{toPush.N = P.N - 1;toPush.A = P.B;toPush.B = P.A;toPush.C = P.C;Push(&S, toPush);toPush.N = 1;toPush.A = P.A;toPush.B = P.B;toPush.C = P.C;Push(&S, toPush);toPush.N = P.N - 1;toPush.A = P.A;toPush.B = P.C;toPush.C = P.B;Push(&S, toPush);}}}int main(){/*int n;cin >> n;*/Hanio(3);cin.get();return 0;}


 
原创粉丝点击