C++汉诺塔问题(河内塔)

C++汉诺塔问题(河内塔)

这是一个非常经典的递归问题。

递归:在函数内部又再次调用函数自身的问题

假设有n个盘子,需要把这些盘子从第一根起始柱A移动到第三根目标柱C中。

1、首先需要把n-1个盘子移动到第二根中转柱B上;

2、再把最后一个也就是最大的那一个盘子移动到第三根目标柱C上;

3、最后再把剩下的n-1个盘子移动到第三根目标柱C上。

我们定义f ( n ) f(n)f(n)是需要移动的次数;

f ( 1 ) = 1 , f ( 2 ) = 3 , f ( 3 ) = 7 f(1) = 1,f(2) = 3,f(3) = 7f(1)=1,f(2)=3,f(3)=7

f ( n ) = 2 f ( n 1 ) + 1 f(n) = 2f(n-1)+1f(n)=2f(n1)+1

#include<iostream>

#include<stdio.h>

using namespace std;

void move(int n, char pos1, char pos3)

{

    //打印移动的过程

    // 1代表上面最小的盘子

    // 2代表中间位置的盘子

    // 3代表下面最大的盘子

    cout << "盘子" << n << "从" << pos1 << "移动到" << pos3<<endl;

}

void Hanoi(int n, char pos1, char pos2, char pos3)

{

    //如果是1个盘子,直接从起始柱A移动到目标柱C

    if (n == 1)

    {

        move(n, pos1, pos3);

    }

    else

    {

        //如果盘子大于1个,需要把n-1个盘子,从起始柱pos1,通过目标柱pos3,移动到中转柱pos2

        Hanoi(n - 1, pos1, pos3, pos2);

        //此时pos1上的n-1个盘子全部移动pos2上去了,那么可以直接把pos1上剩下的1个盘子,直接移动到pos3上

        move(n, pos1, pos3);

        //把pos2剩下的n-1个盘子,通过中转位置pos1,移动到目标位置pos3

        Hanoi(n - 1, pos2, pos1, pos3);

    }

}

int main()

{

    //盘子个数

    int n = 5;

    //起始柱A

    char pos1 = 'A';

    //中转柱B

    char pos2 = 'B';

    //目标柱C

    char pos3 = 'C';

    cout << "移动盘子的顺序如下" << "这里有" << n << "个盘子:" << endl;

    //汉诺塔函数

    Hanoi(n, pos1, pos2, pos3);

    return 0;

}

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值