数据结构与算法 —— 汉诺塔问题

可参考视频:https://www.bilibili.com/video/av18710547/?p=34

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

问题:有X,Y,Z三根柱子,在X柱子上从下往上按照大小顺序放着64片圆盘。把这64个圆盘从X柱子上摆放到Z柱子上,并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?

 1 #include <stdio.h>
 2
 3 void Move(int n, char X, char Y, char Z)    //从上到下依次为第1,第2...第n个盘子
 4 {
 5     if(n == 1)
 6         printf("%c-->%c\n", X, Z);
 7     else
 8     {
 9         Move(n-1, X, Z, Y);            //将n-1个盘子从X 借助Z 移动到Y上
10         printf("%c-->%c\n", X, Z);     //将第n个盘子从X上直接移动到Z上
11         Move(n-1, Y, X, Z);            //将n-1个盘子从Y 借助X 移动到Z上
12     }
13 }

原文地址:https://www.cnblogs.com/FengZeng666/p/9688426.html

时间: 2024-10-05 05:50:12

数据结构与算法 —— 汉诺塔问题的相关文章

【数据结构】递归算法—汉诺塔

汉诺塔的问题,也是一个经典的递归算法问题. 下面是自己总结的一张整体流程图. 下面是代码,代码虽简单,但理解其内部运行原理很重要. //====================================================================== // // Copyright (C) 2014-2015 SCOTT // All rights reserved // // filename: HanNuoTa.c // description: a demo to

[算法]——汉诺塔的递归深度

今天早晨在上班的路上,一好朋友突然提到之前的一个计算机的考题,汉诺塔(相信大家都玩过)的递归深度. 由于很久没有看算法,以及脑容量有限,当时没有多想. 来到公司后,把公式列了一下,终于清晰多了. 下面假设3根柱子编号为1,2,3. 主要思路: 把n个圆盘从3号移到1号 = 把n-1个圆盘从3号移到2号 + 把第n个圆盘从3号移到1号 + n-1个圆盘从2号移到1号 列出公式: f(n) = f(n-1) + 1 + f(n-1) = 2f(n-1) + 1 计算公式: 接下来就是数学题了, 利用

python算法-汉诺塔问题

汉诺塔问题   初始状态: 思考:当盘子的个数是3的时候,大家写出移动顺序 移动的步骤: 3个盘子,从a到c 1.前面两个盘子,从a到b 1)把前面一个盘子,从a到c a->c 2)把第二个盘子,从a到b a->b 3)把c上的盘子,从c到b c->b 2.最后一个盘子,从a到c a->c 3.把b上的两个盘子,从b到c 1)把前面一个盘子,从b到a b->a 2)把第二个盘子,从b到c b->c 3)把a上的盘子,从a到c a->c 总结: n个盘子,从a到c

算法——汉诺塔问题(递归典型)

汉诺塔 汉诺塔是一个发源于印度的益智游戏,也叫河内塔.相传它源于印度神话中的大梵天创造的三个金刚柱,一根柱子上叠着上下从小到大64个黄金圆盘.大梵天命令婆罗门将这些圆盘按从小到大的顺序移动到另一根柱子上,其中大圆盘不能放在小圆盘上面.当这64个圆盘移动完的时候,世界就将毁灭. 算法分析: 一阶汉诺塔的移动,显而易见,从 A->C 然后,我们可以探讨二阶与一阶的联系: 不光是对于二阶,其实N阶汉诺塔相当于执行了三大步骤:  1.在ACB的顺序下执行了(N-1)阶汉诺塔的移法 2.从A->C移动了

[算法]汉诺塔

#include <iostream> #include <cmath> using namespace std; int hannuota(int n, string a, string b, string c) { if (n == 1) { //只有一个盘子的情况下直接将第一个塔上的盘子移动到第三个塔 printf("塔%s------>塔%s\n", a.c_str(), c.c_str()); } else { //1.先将第一个塔的n-1个盘子

算法 - 汉诺塔问题(Python)

def hanoi(n, a, b, c): if(n == 1): print(a, '-->', c) return hanoi(n - 1, a, c, b) print(a, '-->', c) hanoi(n - 1, b, a, c) # Output of hanoi(3, 'A', 'B', 'C'): # A --> C # A --> B # C --> B # A --> C # B --> A # B --> C # A -->

Java算法分析2—————几种排序&amp;汉诺塔算法

一:插入排序 /* * 插入排序 */ /* * 原序列 [12] 15 9 20 6 31 24 * 第0趟 [12 15] 9 20 6 31 24 * 第1趟 [9 12 15] 20 6 31 24 * 第2趟 [9 12 15 20] 6 31 24 * 第3趟 [6 9 12 15 20] 31 24 * n个数,一共需要多少趟?n个数,n-1趟 * 第0趟,把1位置的数,和1位置之前的数进行比较,按大小顺序排列 * 第1趟,把2位置的数,和2位置之前的数进行比较,按大小顺序排列 .

【数据结构与算法】汉诺塔算法——java递归实现

汉诺塔的递归实现算法,将A中的圆盘借助B圆盘完全移动到C圆盘上, 每次只能移动一个圆盘,并且每次移动时大盘不能放在小盘上面 递归函数的伪算法为如下: if(n == 1)    直接将A柱子上的圆盘从A移动到C else    先将A柱子上的n-1个圆盘借助C柱子移动到B柱子上    直接将A柱子上的第n个圆盘移动到C柱子上    最后将B柱子上的n-1个圆盘借助A柱子移动到C柱子上 该递归算法的时间复杂度为O(2的n次方),当有n个圆盘时,需要移动圆盘2的n次方-1次 public class

数据结构与算法—递归(阶乘、斐波那契、汉诺塔)

目录 递归介绍 递归求阶乘 递归求斐波那契 递归解决汉诺塔 总结 递归介绍 递归:就是函数自己调用自己. 子问题须与原始问题为同样的事,或者更为简单:递归通常可以简单的处理子问题,但是不一定是最好的.对于递归要分清以下概念: 自己调用自己 递归通常不在意具体操作,只关心初始条件和上下层的变化关系. 递归函数需要有临界停止点,即递归不能无限制的执行下去.通常这个点为必须经过的一个数. 递归通常能被其他方案替代(栈.数组正向求). 认识递归,递归函数通常简易但是对于初学者可能很难取理解它.拿一个递归