【C语言】汉诺塔

目录

什么是汉诺塔

思路

C语言代码的实现

 总结:


📢什么是汉诺塔

汉诺塔(Tower of Hanoi),又称河内塔,是一个源于古老印度传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

大意是:有64根圆盘,从底部,由从大到小的顺序向上排列,一次性移动一个圆盘,将A中的圆盘全部移到C圆柱上

要求:每次移动要保证每个圆盘底部的圆盘必须比它小

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6K-a5oya55qE5LmU5rK7,size_20,color_FFFFFF,t_70,g_se,x_16

如果有一个圆盘就需要2^1-1次移动

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6K-a5oya55qE5LmU5rK7,size_20,color_FFFFFF,t_70,g_se,x_16

如果有两个圆盘,就需要2^2-1次移动

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6K-a5oya55qE5LmU5rK7,size_20,color_FFFFFF,t_70,g_se,x_16

 如果有三个圆盘,就需要2^3-1次移动

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6K-a5oya55qE5LmU5rK7,size_20,color_FFFFFF,t_70,g_se,x_16

 当有n个圆盘的话,当n越大的话,实现的难度也越大

如果n等于64,就需要2^64-1次移动

如果一秒钟移动一次的话

就需要(2^64-1)/3600/24/366=58344214028,五千亿年的时间

一位美国科学家,用一种出乎意料的方法,用C语言,pathon等高级语言两步实现了这个问题

📢思路

这个问题可以用递归来实现

首先什么是递归

递归思想就是一个函数自己调用自己,实现复杂的问题简单化,用少量的代码实现复杂的问题

同时每一次的调用,就越靠近这个递归的条件

pos1是起始位置

pos2是中转位置

pos3是最终目的

意思就是将pos1上的圆盘,经过pos2的位置上,到达最终位置pos3.

📢 首先将n-1上的圆盘通过pos3,转移到pos2

其次就将pos1上的剩下的一个圆盘移到pos3上

最后再将n-1个圆盘通过pos2,转移到pos3上

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6K-a5oya55qE5LmU5rK7,size_20,color_FFFFFF,t_70,g_se,x_16

📢C语言代码的实现

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>void move(char pos1,char pos3){printf("%c->%c ", pos1, pos3);}void Hanoi(int n, char pos1, char pos2, char pos3){if (n == 1){move(pos1, pos3);}else{Hanoi(n-1, pos1, pos3, pos2);move(pos1, pos3);Hanoi(n - 1, pos2, pos1, pos3);}}int main(){int n = 0;scanf("%d", &n);Hanoi(n, 'A', 'B', 'C');return 0;}

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6K-a5oya55qE5LmU5rK7,size_20,color_FFFFFF,t_70,g_se,x_16

📢 总结:

对汉诺塔问题进行分析时,如果对每一个过程进行分析的话,非常的复杂,需要将它作为一个整体,我们需要将n-1当作一个整体,先将最大的圆盘从A转移到C位置上,这样对问题的分析就较为容易一些。

欢迎点赞收藏加关注,如若有问题可以提出来😁😁😁😁

评论 59
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值