• 经典算法-----汉诺塔问题


    前言

    今天我们学习一个老经典的问题-----汉诺塔问题,可能在学习编程之前我们就听说过这个问题,那这里我们如何去通过编程的方式去解决这么一个问题呢?下面接着看。

    在这里插入图片描述

    汉诺塔问题

    问题描述

    这里是引用汉诺塔问题源自印度一个古老的传说,印度教的“创造之神”梵天创造世界时做了 3 根金刚石柱,其中的一根柱子上按照从小到大的顺序摞着 64 个黄金圆盘。梵天命令一个叫婆罗门的门徒将所有的圆盘移动到另一个柱子上,移动过程中必须遵守以下规则:
    每次只能移动柱子最顶端的一个圆盘;
    每个柱子上,小圆盘永远要位于大圆盘之上;

    下面展示一个三个的汉诺塔解决过程,如下图所示:
    在这里插入图片描述
    在这里插入图片描述
    其他情况:
    在这里插入图片描述

    解决思路(分治算法

    看上面这几个图,我们是否发现这么一个特点,要想把A柱子(起始柱)上的汉诺塔转移到C柱子(目标柱)上,而且还要满足汉诺塔的基本条件,那就把第三个柱子作为辅助柱(B柱),假设A柱子上有n个汉诺塔,这时候先把A柱子除了最下面的一层,其余的全部汉诺塔先放到B柱子上面,然后再把A柱子最下面的汉诺塔放到C柱子上,然后把B柱子上面的汉诺塔重新放回给A柱子当中(这个过程,C柱作为辅助柱子,B是起始柱,A是目标柱),这个过程就完成了一次放置,此时A柱子上面就剩下n-1个汉诺塔,再次重复以上的过程,最后就完成了汉诺塔的转移。

    汉诺塔问题中,3 个圆盘至少需要移动 7 次,移动 n 的圆盘至少需要操作 2^n-1 次。

    在汉诺塔问题中,当圆盘个数不大于 3 时,多数人都可以轻松想到移动方案,随着圆盘数量的增多,汉诺塔问题会越来越难。也就是说,圆盘的个数直接决定了汉诺塔问题的难度,解决这样的问题可以尝试用分治算法,将移动多个圆盘的问题分解成多个移动少量圆盘的小问题,这些小问题很容易解决,从而可以找到整个问题的解决方案。

    代码实现(C语言)

    #include
    
    //打印移动的过程
    void move(char x, char y) {
    	printf("%c--->%c\n", x, y);
    }
    
    //递归移动
    void generate(int n,char a, char b, char c) {
    	if (n == 0)
    		return;	//如果移动完成了就返回,开始递归运算
    
    	//第一个过程,先把A柱子上的前n-1个汉诺塔移到B柱子上,再把最底下的那个汉诺塔移动到C上
    	
    	//此时a是起始柱子,c是目标柱,b是辅助柱		a--->c
    	generate(n - 1, a, c, b);
    	move(a, c);
    
    	//第二个过程,当第一个过程完成了之后,就要把B柱子上的n-1个汉诺塔移回A柱子,这就是整体一个分支过程
    	//此时b是起始柱,a是目标柱,c是辅助柱		b--->a
    	generate(n - 1, b, a, c);
    }
    
    int main() {
    	int n;
    	printf("输入汉诺塔个数:");
    	scanf("%d", &n);
    	generate(n, 'A', 'B', 'C');
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    运行结果如下:
    在这里插入图片描述

    好了,以上就是本期的全部内容了,这个汉诺塔是不是很有意思呢?你学会了吗?
    分享一张壁纸:在这里插入图片描述

  • 相关阅读:
    Dubbo安装部署
    iframe之间传递数据笔记
    以用地业务链串接为核心的自然资源业务数据治理与重构路径
    计算机毕业设计ssm高校学报管理系统lt10k系统+程序+源码+lw+远程部署
    阿里云产品试用系列-云服务器 ECS
    自然语言处理 中文停用词词典
    PHP自己的框架2.0版本目录结构和命名空间自动加载类(重构篇一)
    计算机毕业设计ssm+vue基本微信小程序的今日菜谱系统
    Leecode-SQL 1527. 模糊查询匹配(模糊查询用法)
    展会预告 | 图扑邀您共聚 IOTE 国际物联网展·深圳站
  • 原文地址:https://blog.csdn.net/m0_73633088/article/details/133579652