同样,借此来强化学习,但是说实话我写这个感觉很玄。Hanoi塔是昨天刚学到的东西,想了很久,感觉还是没有悟透,可能学到更多新东西,或产生了新的想法,或突然悟到了什么,届时会再做修改。
看了很多关于Hanoi塔的博客,说实话都是一头雾水,可能也是因为鄙人的理解能力有欠缺。一直看到一位博主的一篇讲解才略有启发,博客↓↓↓
传送门

(后续)
发现一位B站UP主的讲解更加细致,留下链接:↓↓↓
传送门

OK,言归正传。
Hanoi塔起源是什么?我们不多说,有兴趣的可以查一下。

Hanoi塔的规则是什么?

有三根柱子,将A柱子上所有的圆盘转移到C柱子。
1.在小圆盘上不能放大圆盘。
2.在三根柱子之间一回只能移动一个圆盘。
3.只能移动在最顶端的圆盘。

具体操作?

我们从最简单的开始:
一个盘:A→C;
两个盘:A→B,A→C,B→C;
三个盘:A->C , A->B , C->B , A->C , B->A , B->C , A->C

一个盘的时候,直接由A柱到C柱
两个盘的时候,把不是最大的一个放到B柱,然后把最大的从A放到C柱,再把B柱上的小盘放到C柱
三个盘的时候,步骤相同其实,就是把不是最大的放到B柱然后把最大的放到C柱,再借助A柱重复做一次两个盘的情况的步骤(其实就是重复两次)。

我们要解决n层Hanoi塔就要解决n-1层Hanoi塔,
我们要解决n-1层Hanoi塔就要解决n-2层Hanoi塔,
……
……
我们要解决3层Hanoi塔就要解决2层Hanoi塔,
我们要解决2层Hanoi塔就要解决1层Hanoi塔,
(分治思想)

总结一下:
只需要两步来解决这个问题:
第一步:
把n-1个小盘,从A柱移动到B柱,
把第n个小盘,由A柱移动到C柱。
第二步:
把n-1个小盘,从B柱移动到C柱。←其实这一步就是换位置后重复第一步。
接下来做题有疑问 可以返回这里查看。

在这里我先放上一道题以及完整的代码:

Description:

如图所示的三根针,其中A针上穿好了由大到小的64片金片,不论白天黑夜,总有一个和尚在按照下面的法则移动金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。和尚们预言,当所有的金片都从A针移到C针上时,世界就将在一声霹雳中消失,这就是所谓的汉诺塔。请编程求出将A针上所有金片移到C上的步骤。

Input

标准输入,一个整数N,表示有N个金片。

Output

标准输出,输出所有步骤,每一步骤占一行。

Input Copy
3
Output
A->C
A->B
C->B
A->C
B->A
B->C
A->C

完整代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
void f(int n,char a,char b,char c)
{if(n==1)cout<<a<<"->"<<c<<endl;else{f(n-1,a,c,b);cout<<a<<"->"<<c<<endl;f(n-1,b,a,c);}
}
int main()
{int n;cin>>n;f(n,'A','B','C'); return 0;
}

我们要理解一个问题f()函数的4个位置分别的什么意思?
例如f(n,‘A’,‘B’,‘C’)
这里我们不是按照顺序分析:
第二个位置,就是起始位置(位置1),也就是,你要把小盘从哪个柱子上拿走。
第四个位置,就是目标位置(位置3),也就是,你要把小盘全都按照顺序放到这跟柱子上。
第三个位置,就是中转位置(位置2),也就是,你要把最大的盘子,畅通无阻的从起始位置放到目标位置,其他的n-1个盘子必须放在这根柱子上。
第一个位置,就是我要转移小盘的数量。

可能发现了,我又写出位置1,位置2,位置3,为什么呢?
这是为了不让我们搞混与ABC搞混,ABC只是柱子的编号。
我们逐步分析,首先看main函数:

int main()
{int n;cin>>n;f(n,'A','B','C'); return 0;
}

什么意思?根据之前说过的,我们可以知道,**就是把n个小盘,由A柱经B柱中转放到C柱上。**这也就是我们的目标。

再来看函数部分

void f(int n,char a,char b,char c)
{if(n==1)cout<<a<<"->"<<c<<endl;else{f(n-1,a,c,b);cout<<a<<"->"<<c<<endl;f(n-1,b,a,c);}
}

当只有一个盘子的时候,只要把A的盘子放到B即可。
如果大于1个,那么f(n-1,a,c,b)先把n-1个小盘,由A经过C的中转放到B。
然后再把第n个由A放到B
然后再把剩下的n-1个小盘由B经过A的中转放到C
(步骤最开始有提到过)

TIP

1.理解过程,分治的思想,把一个大问题分成若干个小问题,如果你试图自己置身于一个递归,我想不是天赋异禀,的确不一定能看的透……

所以你只要告诉他什么情况该做什么就好了,有些东西是一般人做不来的……比如鄙人……。整体考虑!整体考虑!整体考虑!

以上只是鄙人的拙见,如有不足之处,敬请斧正,如有难以理解的地方,亦可以指出。

小知识系列(3):Hanoi塔(汉诺塔,河内塔)相关推荐

  1. Tower of Hanoi(汉诺塔)详解

    一个经典的汉诺塔问题,带着我自己的理解给做这个问题的友友们解决一下,包括我本人在做的时候也遇到的一些问题给大家阐述一下.话不多说,来看: 汉诺塔 问题描述: 汉诺塔(Hanoi Tower),又称河内 ...

  2. 2016年圣诞节巨献:C#汉诺塔河内塔游戏(动画、圣诞节音效)源码及安装包

    终于把VS的的打包搞定了,高兴啊! 圣诞节巨献:C#汉诺塔河内塔游戏(动画效果.圣诞节音效).在平庸而又乏味的生活中,来一把紧张而刺激的汉诺塔游戏,生活,就是这么美好.游戏代码可以在博主的资源页下载! ...

  3. 具体数学 递归问题1.1 从河内塔/汉诺塔开始

    河内塔问题 在经典河内塔问题中,有3根柱子和N个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子.一开始,所有盘子自上而下按从大到小依次套在一根柱子上,现在想将所有的圆盘按照原来的位置从一根柱子移动到另一 ...

  4. Hanoi Tower 汉诺塔的简单分析/C

    当然.这是一个经典的递归问题~    想必来看这篇博文的同学对汉诺塔应该不会陌生了吧, 写这篇博还是有初衷的: 之前学数据结构的时候自己看书.也上网上查了很多资料,资料都比较散.而且描述的不是很清楚, ...

  5. hanoi塔递归算法c语言,递归算法 Hanoi(汉诺)塔问题

    Hanoi(汉诺)塔问题.这是一个古典的数学问题,是一个用递归方法解题的典型例子.问题是这样的:古代有一个梵塔,塔内有3 个座A.B.C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上.有 ...

  6. 汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺

    import java.awt.*; import java.awt.event.*; public class hanota extends Frame implements ActionListe ...

  7. 【PE806】Nim on Towers of Hanoi(汉诺塔游戏,生成函数)

    PE:Project Euler 题意: 汉诺塔游戏是如下的问题:有三根柱子,第一根柱子套有 n n n 个圆盘,圆盘从上往下半径递增.每次操作可以把套在某根柱子上的最上面的那个圆盘移到另一个柱子上. ...

  8. 汉诺塔+汉诺四塔(C/C++)

    目录 汉诺塔 1  简介 2  代码思路 2.1  对于次数的理解 2.2  对于移动的理解 3  代码 4  加深理解 汉诺四塔 1  思路 2  代码 汉诺塔 1  简介 汉诺塔(Tower of ...

  9. 个人心得——hanoi问题 汉诺塔问题详细分析

    简单地介绍题目 点进来的各位其实也应该不陌生了,三根柱子,N个圆盘,要求把所有的圆盘从第一根柱子放到第三根上,并且编号下面的圆盘不能放在编号上的圆盘上.这个问题其实知乎上有很多答主都答得不错,这里我想 ...

最新文章

  1. ImageMagick远程代码执行漏洞CVE-2016-8707 绿盟科技发布安全威胁通告
  2. 《Redis in action》读书笔记
  3. uboot流程——uboot启动流程
  4. 哪款浏览器好用_碉堡了!火狐浏览器发布重大更新,谷歌Chrome请hold住!
  5. 使用多个tomcat如何修改端口号
  6. mysql显示nan_Python将dataframe连接到MySQL时出现NaN[mysqlconnector]
  7. Citespace、vosviewer 文献信息可视化分析
  8. 下docfetcher先下Java,docfetcher怎么用?docfetcher搜索文档内容的方法介绍
  9. 计算机组装后要干什么,电脑组装完后还有哪些事需要干?
  10. 硬盘和硬盘驱动器的区别
  11. 2022年NOC软件创意编程(学而思赛道)选拔赛小学高年级组python,包含答案
  12. AutoCAD与ArcGIS的5种集成方式
  13. 反向传播计算前级delta时,后级delta去掉常数偏置参数delta0的原因
  14. 1905 统计子岛屿
  15. 2022-2027年(新版)中国LCP行业发展前景及需求规模预测报告
  16. 最适合小白的Odoo12框架详解(更新完毕!!!有错请指正)
  17. 树莓派4B-Python-控制DS18B20(温度传感器)
  18. 悟空分词与mysql结合_悟空分词的搜索和排序源码分析之——搜索
  19. xss平台模块代码分析--默认模块
  20. linux系统ttl端口,利用TTL值来鉴别操作系统

热门文章

  1. ChinaGrid要建8朵“云”
  2. 蝴蝶曲线python_蝴组词有哪些?除了蝴蝶还可以组什么?蝴字的基本字义
  3. python里面pow是什么意思_pow在python中是什么意思
  4. Ubuntu下连接红米2无法找到设备解决方案
  5. 各位师兄妹,来刷腾讯了,好多经验...
  6. Android通过蓝牙获取设备的通讯录、通话记录等
  7. 能考上重本的学生成绩处于什么水平?看完这篇就懂了
  8. 3dsmax建模总结
  9. Linux系统信息收集
  10. 知识表示学习(KG Embedding)—— TransX系列