汉诺塔算法演示

本文介绍了经典的汉诺塔问题,详细阐述了如何通过移动碟子将所有盘子从杆A移动到杆C,强调了游戏规则及随着碟子数量增加,所需步骤指数级增长的特点。
摘要由CSDN通过智能技术生成
 汉诺塔游戏简述:

有三根杆子A,B,C,A杆上有n个碟子,每次移动一块碟子,小的只能叠在大的上面(若杆子上没有碟子,可直接放上),要求把所有碟子从A杆全部移到C杆上。游戏看似简单,实际的操作步骤却相当复杂,当有n个碟子时,需要的步骤为2n-1,当n较大时,所需步骤是相当惊人的。

汉诺塔问题是程序设计中的经典递归问题,可以用递归解决。
现在假设要搬动64个碟子,则我们可以考虑先将A杆上的第64个盘子,即最大的盘子放到C上,最大的盘子一旦在C杆放好,就不需去考虑了。那么如何才能将A杆的第64个盘子放到C上了?首先是将其上面的63个盘子移到B杆上,然后将第64个盘子放到C杆上。这时A为0,B为63,C为1。
此时我们换位思考下,即将B杆与A杆位置换一下,问题是不是又转化成搬动63个碟子的问题了,依次类推,直到只剩一个盘子的情况为止。
于是任务变成了:
*将A杆上面的63个盘子移到B杆上;
*将A杆上剩下的盘子移到C杆上;
*将B杆上的全部盘子移到C杆上。

以下程序是汉诺塔算法的简单演示:
    #include  < stdio.h >
#include 
< iostream >
using   namespace  std;
void  hanoi( int  n,  char  A, char  B, char  C);
int  main( void )
{
int count;
cout 
<< "请输入碟子的数量" << endl;
cin 
>> count;
hanoi(count,
'A','B','C');
}

void  hanoi( int  n,  char  A, char  B, char  C)
{
    
if(n == 1)
    
{
        cout 
<< A << " ==> "<< C << endl;
    }

    
else
    
{
        hanoi(n
-1, A, C, B);
        cout 
<< A <<" ==> "<< C << endl;
        hanoi(n
-1, B, A, C);
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值