汉诺塔问题的两种解法:
基本原理:
//二叉树的中序遍历
//树为一个满二叉树 树的每一个节点都是一个用四元组表示的汉诺塔问题
//如果阶数大于1 就表明当前该树有左右孩子
//它和左孩子的关系是 阶数差1 中间位置和结束位置互换
//它和右孩子的关系是 阶数差1 起始位置和中间位置互换
1,HanoiRecursion:
#include<bits/stdc++.h>
using namespace std;
void Hanoi(int n,char S,char M,char E)//n表示是几阶汉诺塔问题
{
if(n<=0){return ;}
if(n>1)//左
{
Hanoi(n-1,S,E,M);
}
cout<<n<<':'<<S<<"->"<<E<<endl;
if(n>1)//右
{
Hanoi(n-1,M,S,E);
}
}
2,HanoiIteration:
class Node
{
public:
int n;
char S,M,E;
Node(int n,char S,char M,char E)
{
this->n=n;
this->S=S;
this->M=M;
this->E=E;
}
};
//汉诺塔迭代算法
void HanoiIteration(int n,char S,char M,char E)//start medium end
{
if(n<=0){return ;}
stack<Node*> Nodestack;
Node* cur=new Node(n,S,M,E);
while(!Nodestack.empty()||cur->n!=0)
{
if(cur->n!=0)
{
Nodestack.push(cur);
cur=new Node(cur->n-1,cur->S,cur->E,cur->M);//左孩子 中间位置与末尾位置交换
}
else
{
cur=Nodestack.top();
Nodestack.pop();
cout<<cur->n<<":"<<cur->S<<"->"<<cur->E<<endl;
cur=new Node(cur->n-1,cur->M,cur->S,cur->E);//右孩子 开始位置与中间位置交换
}
}
}