利用递归 c++实现汉诺塔

汉诺塔问题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
移动规则:
每次只能移动一个圆盘;
圆盘可以插在A、 B和C中的任何一个塔座上;
任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。

假设盘的序号从上往下增大,第一个盘序号为1,最后一个盘序号为n。每次只能移动一个盘,并且大盘不能在小盘的上面。那么运用递归的思想可知,若想将n号盘放到z轴上,那么必须先将(1,…,n-1)号盘移动到y轴上,此时z轴作为辅助轴。即

hanoi(n-1,x,z,y);

然后移动n号盘到z轴上,即

move(x,n,z);

最后将y轴上的(1,…,n-1)号盘移动到z轴上,此时x轴作为辅助轴。即

hanoi(n-1,y,x,z);
#include <iostream>

using namespace std;

void move(char from,char to){
    cout<<"Move"<<from<<"to"<<to<<endl;

    }
void hanoi(int n,char first,char second,char third){
    if(n==1)
    move(first,third);
    else{
        hanoi(n-1,first,third,second);
        move(first,third);
        hanoi(n-1,second,first,third);
        }
    }

int main()
{
   int m;
   cout<<"the number of diskes:";
   cin>>m;
   cout<<"move "<<m<<" diskes:\n";
   hanoi(m,'A','B','C');

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值