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;
}