hanoi塔问题如下图所示_hanoi塔问题最经典的算法

hanoi塔问题如下图所示_hanoi塔问题最经典的算法什么是hanoi塔?汉诺塔问题:古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个和尚想把这64个盘子从A座移到B座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。如下图问题解答问题定义我们把左边的柱子叫做A,中间的柱子叫做B,右边的柱子叫做Chanoi塔的搬运过程;i

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

什么是hanoi塔?

汉诺塔问题:古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个和尚想把这64个盘子从A座移到B座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。如下图

hanoi塔图示

问题解答

问题定义
我们把左边的柱子叫做A,中间的柱子叫做B,右边的柱子叫做C

hanoi`塔的搬运过程;
i :左边的柱子只有两个圆盘

我们先假设在A柱子上只有两个圆盘,不用图我们用大脑想象出来最佳流程就是,现在最小的放在B柱子上面然后把大的放在C上面,最后把B柱子上面的小圆盘放在C柱子上。

ii:左边的柱子上面有三个圆盘 过程如下图: `在这种情况下,我们可以把上面的两个圆盘看作是一个,然后又回到了i情况,下图展示了三个圆盘的转移过程` ![三个圆盘的hanoi过程](https://img-blog.csdnimg.cn/img_convert/f8d12ace981cf0cd72af4da2f57daaf1.png) iii:左边的柱子上有四个圆盘的时候 在这种情况我们通过作图做出hanoi的转移流程是很困难的了,我们可以用在`ii`中提及到的过程,就是我们先把上面的三个看作是一个,我们第一步的目的就是把前三个移动到中间的柱子上去。下面简单说一下转移步骤 1. 将A柱子上面的三个移动到B柱子上面(借助C柱子) 2. 将A柱子上面中最下面的圆盘移动到C柱子上面 3. 将B柱子上面的所有圆盘移动到C柱子上面(借助A柱子) 过程如下图: ![四个圆盘的hanoi](https://img-blog.csdnimg.cn/img_convert/7e80f4dd8a45878f9ae993e6a0fa6ea8.png) > 问题总结 > 通过上面的描述我们把hanoi移动的步骤一般化 >


  1. 将左边柱子上的N-1个圆盘移动带中间的柱子上
  2. 将第N个圆盘移动到最右边的柱子
  3. 将中间柱子上的所有圆盘移动到最右边的柱子

下面我们给出具体的代码

void hanoi(int n,char A,char B,char C)
{
    if(n<=1) {
        printf("1 move %c to %c\n",A,C);
        return ;
    }
    hanoi(n-1,A,C,B);
    printf("%d move %c to %c \n",n,A,C);
    hanoi(n-1,B,A,C);
}

Jetbrains全家桶1年46,售后保障稳定

不要在看了,这就是全部代码了。已经没有了
╭︿︿︿╮
{/ o o /}
( (oo) )
︶ ︶︶
以上是对hanoi塔的总体概述,下面就要聊一聊真正的代码流程!

代码详解

hanoi(n,A,B,C)代表的意义就是讲n个圆盘从A移动到C借助B;

  • n等于1的时候,就代表把当前A中最大的圆盘直接从A移动到C
  • n等于2的时候,就调用hanoi(2,A,B,C)也就是执行下面的三个步骤下面就是本文中重点了
  1. 调用honoi(1,A,C,B)就是相当于把***B柱和C柱交换***了
  2. 执行打印语句,不进行继续调用。所以不用交换柱子
  3. 调用hanoi(1,B,A,C)相当于把***B柱和A柱交换***了
    上面的语句可以表述为:
hanoi(1,A,C,B); 
printf("%d move %c to %c \n",n,A,C);
hanoi(1,B,A,C); 

这就是对代码的解释!
当圆盘更多的时候无非就是进行递归知道递归到上面的状态,比如有三个圆盘的时候,调用的是:

hanoi(2,A,C,B); //step1
printf("%d move %c to %c \n",n,A,C);
hanoi(2,B,A,C); 

只要理解了前两个对后面的理解也就不难了!还有一点题外话,当递归到程序注释的step1的时候,会为后续语句分配空间但不执行

hanoi塔还有一个进阶的题目就是判断当前的状态时第几个最优的状态,将在下篇文章进行讲述!

如果对我的文章感兴趣可以关注的公众号:云影原生。
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210738.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java爬虫实现

    java爬虫实现爬虫入门手写一个Java爬虫本文内容 涞源于 罗刚 老师的 书籍&lt;&lt;自己动手写网络爬虫一书&gt;&gt;;本文将介绍1:网络爬虫的是做什么的? 2: 手动写一个简单的网络爬虫;1: 网络爬虫是做什么的? 他的主要工作就是跟据指定的url地址 去发送请求,获得响应, 然后解析响应, 一方面从响应中查找出想要查找的数据,另一方面从响应中解析出新的URL…

    2022年7月8日
    18
  • es6数组 newSet 数组去重 并集 交集 差集

    es6数组 newSet 数组去重 并集 交集 差集数组去重vararr=[1,2,3,3,1,4];[…newSet(arr)];//[1,2,3,4]Array.from(newSet(arr));//[1,2,3,4][…newSet(‘ababbc’)].join(’’);//“abc”字符串去重newSet(‘icedoughnut’);//Set(11){“i”,“c”,“e”,””,“d”,…}并集vara=newSet([1,2,3]);varb=ne

    2025年7月27日
    0
  • 用js来实现那些数据结构07(链表01-链表的实现)

    前面讲解了数组,栈和队列。其实大家回想一下。它们有很多相似的地方。甚至栈和队列这两种数据结构在js中的实现方式也都是基于数组。无论增删的方式、遵循的原则如何,它们都是有序集合的列表。在js中,我们新建

    2022年3月25日
    32
  • 【算法题】单例模式的8种实现方式(java版)「建议收藏」

    【算法题】单例模式的8种实现方式(java版)「建议收藏」根据马士兵老师的视频整理下来的8种单例模式的实现方式,在此记录一下。代码示例1:饿汉式packagecom.examples.singleton;publicclassMgr01{publicstaticvoidmain(String[]args){Mgr01m1=Mgr01.getInstance();Mgr01m2=Mgr01.getInstance();System.out.println(m1…

    2022年7月8日
    18
  • layoutSubviews 和 drawRect

    layoutSubviews 和 drawRect转自http://justsee.iteye.com/blog/1886463UIView的setNeedsDisplay和setNeedsLayout方法。首先两个方法都是异步执行的。setNeedsDisplay会调用自动调用drawRect方法,这样可以拿到UIGraphicsGetCurrentContext,就可以画画了。而setNeedsLayout会默认调用lay

    2022年7月15日
    13
  • 股票实盘交易接口API(招商证券交易接口api)

    股票配资系统实盘交易接口怎么做有没有好用的实盘交易接口股票实盘交易接口做股票配资系统难免会用到交易接口,好用的能用的接口也少。券商那边也不提供,那索性自己开发股票配资实盘交易接口了。经过多次尝试,总算搞出来了,实时交易接口可以获取用户数据,实时对接,账户信息,委托买入卖出,支持多家券商。我们做股票配资系统的时候遇到过很多次交易接口问题,然后后面终于是解决了,现在我们的股票配资系统已经很完善…

    2022年4月15日
    577

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号