汉诺塔问题

【汉诺塔问题】

设有3个命名为A、B、C的塔座,在塔座A上插有n个直径大小各不相同、依小到大编号为1,2…,n的圆盘。现要求将A轴上的n个圆盘移至塔座C上并仍按相同顺序叠排。

严版教材解析:

  1. 当n = 1时,只要将编号为1的圆盘从塔座A直接移至塔座C;
  2. 当n > 1时,需利用B作为辅助塔座,先将A上n-1个圆盘移动到B上,再将A上剩余的n号圆盘移动到C上,最后将B上的n-1个圆盘移动到C上。

而如何将n-1个圆盘从一个塔座移至另一个塔座的问题是一个和原问题具有相同特征属性的问题,只是问题的规模小1,因此可以用同样的方法求解。

#include<stdio.h>

int count = 0;  //对移动次数进行计数
void hanoi(int n, char x, char y, char z)
{//将n个从小到大叠加在x柱子上的圆盘从柱子x移动到柱子z上,y为辅助柱子,
//移动期间小圆盘永远在大圆盘之上
    if(n == 1)
        printf("第%d次移动:move %c to %c\n", ++count,x,z);
    else
    {
        hanoi(n-1,x,z,y);   //先将n-1个圆盘移动到y柱子上
        printf("第%d次移动:move %c to %c\n", ++count,x,z);//将x中剩下那个移动到z柱子上
        hanoi(n-1,y,x,z);   //最后想y中的n-1个圆盘移动到z柱子上
    }
}

void main()
{
    int n;
    printf("请设置hanoi中圆盘的总个数:\n");
    scanf("%d", &n);
    hanoi(n,'A','B','C');
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值