/* 汉诺塔 递归解法 */
#include <iostream>
using namespace std;
void Hanoi(int n,char src,char mid,char dest){
if (n == 1)
{
cout<<src<<"->"<<dest<<endl;
return;
}
Hanoi(n-1,src,dest,mid); // 将最上面的n-1个盘子通过 dest 移动到 mid
cout<<src<<"->"<<dest<<endl; // 将最底的盘子移动到 dest
Hanoi(n-1,mid,src,dest); // 将n-1 个盘子通过src移动到dest;
return;
}
int main(){
int n;
cin>>n;
Hanoi(n,'A','B','C');
return 0;
}
/* 汉诺塔问题 栈的直接解法 */
#include <iostream>
using namespace std;
#include <stack>
struct Problem{
int n;
char src,mid,dest;
Problem(int nn, char a,char b,char c): n(nn),src(a),mid(b),dest(c){};
};
stack <Problem> stk;
int main(){
int n;
cin>>n;
stk.push(Problem(n,'A','B','C'));
while(! stk.empty()){
Problem curPrb = stk.top();
stk.pop();
if (curPrb.n == 1)
{
cout<<curPrb.src<<"->"<<curPrb.dest<<endl;
}
//最后一个子问题
else{
stk.push(Problem(curPrb.n -1,curPrb.mid,curPrb.src,curPrb.dest));
//第二个子问题
stk.push(Problem(1,curPrb.src,curPrb.mid,curPrb.dest));
//第一个子问题
stk.push(Problem(curPrb.n -1,curPrb.src,curPrb.dest,curPrb.mid));
}
}
return 0;
}
汉诺塔问题的两种解法
最新推荐文章于 2024-08-07 20:15:08 发布