汉诺塔简单了解

汉诺塔详解

以4层为例
以下为我的拙见,还希望大佬雅正
在这里插入图片描述
要把汉诺塔移动到c 需要把1,2,3层移到b 把4移动到c 在吧123移动到b
在这里插入图片描述
但是一次只能动一块 所以我们目前要做的就是把上面三块移动到b
那就需要把1 2移动到c 在这里插入图片描述
由此我们可以推出要把1,2移动到c,只需要把1移动到b
这里我们发现有很多重复的自相似动作
我们就可以设计递归 递归需要1,递归体 2 出口。
递归体
移动n-1个盘子和1个盘子和n个盘子过程都是相似的
但是每次放入的杆子不一样。
出口
n=1时只剩一个盘子,直接移动到c即可
hanoi(n ,A , B , C)
N 移动数量
A 出发地
B 借助地
C 终点
这个函数的意思就是有n个盘子从A出发借助B来到C
现在有n层汉诺塔 就需要把上面n-1层移动到B

在这里插入图片描述

hanoi(n-1,A,C,B)
这个函数就是我们要把n-1个盘子从A借助C移动到B
在这里插入图片描述
move(a,c)现在不需要再借助了 可以直接从a移动到c
接下来我们就要借助A吧剩下n-1个盘子移动到C了
hanoi(n-1,B,A,C)即可完成
递归出口
n<=1

在这里插入代码片
```// 汉诺塔问题
//输出移动的步骤 
#include <stdio.h>
//记录步数 
int i = 1;
//n 第几号盘移动, from 移动塔  to 目标塔 
void move(int n, char from, char to) {
    printf("第%d次移动第%d号盘: %c----->%c\n", i++, n, from, to);
}

void hanoi(int n, char from, char mid, char to) {
    if (n == 1) {
        move(n, from, to);//只有一个盘子是直接将初塔上的盘子移动到目的地
    }//函数出口
    else {
        hanoi(n - 1, from, to, mid);//先将初始塔的前n-1个盘子借助目的塔移动到借用塔上
        move(n, from, to);        //将剩下的一个盘子移动到目的塔上
        hanoi(n - 1, mid, from, to);//最后将借用塔上的n-1个盘子移动到目的塔上
    }
}

int main() {
    printf("请输入盘子的个数:\n");
    int n;
    scanf_s("%d", &n);
    char x = 'A', y = 'B', z = 'C';
    printf("盘子移动情况如下:\n");
    hanoi(n, x, y, z);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值