Hanoi问题

n 阶 Hanoi 塔问题假设有三个分别命名为 X、Y 和 Z 的塔座,在塔座 X 上插有 n 个直径大小各不相同、从小到大编号为 1,2,...,n 的圆盘,如下图所示。

图. Hanoi 塔问题

现要求将 X 塔上的 n 个圆盘移动到 Z 上并仍按同样的顺序叠放,圆盘移动时必须遵循下列规则:
• 每次只能移动一个圆盘;
• 圆盘可以插在 X、Y 和 Z 中的任一塔座上;
• 任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。

递归代码如下:

 1 hanoi.c
 2
 3
 4 /*
 5 * @brief 将塔座 x 上按直径有小到大且自上而下编号
 6 * 为 1 至 n 的 n 个圆盘按规则搬到塔座 z 上,y 可用做辅助塔座.
 7 * @param[in] n 圆盘个数
 8 * @param[in] x 源塔座
 9 * @param[in] y 辅助塔座
10 * @param[in] z 目标塔座
11 * @return 无
12 * @note 无
13 * @remarks 无
14 */
15 void hanoi(int n, char x, char y, char z)
16 {
17   if(n == 1)
18
19   {
20     /* 移动操作 move(x,n,z) 可定义为(c 是初始值为的全局变量,对搬动计数)
21       printf("%i. Move disk %i from %c to %c\n", ++c, n, x, z);
22     */
23     move(1, x, z); /* 将编号为 1 的圆盘从 x 移动到 z */
24     return;
25   }
26
27   else
28
29   {
30     /* 将 x 上编号 1 至 n-1 的圆盘移到 y,z 作辅助塔 */
31     hanoi(n-1, x, z, y);
32     move(n,x,z); /* 将编号为 n 的圆盘从 x 移到 z */
33     /* 将 y 上编号至 n-1 的圆盘移到 z,x 作辅助塔 */
34     hanoi(n-1, y, x, z);
35   }
36 }
时间: 2024-11-09 02:48:33

Hanoi问题的相关文章

ZOJ 2954 Hanoi Tower(模拟啊 )

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1953 You all must know the puzzle named "The Towers of Hanoi". The puzzle has three pegs (peg 1, peg 2 and peg 3) and N disks of different radii. Initially all disks are located on

汉诺塔-Hanoi

1. 问题来源: 汉诺塔(河内塔)问题是印度的一个古老的传说. 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面.僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔.

3-6-汉诺塔(Hanoi Tower)问题-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第3章  栈和队列 - 汉诺塔(Hanoi Tower)问题 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? 无外链        相关测试数据下载  链接? 无数

Hanoi Tower问题的求解

文章前部分为转载,转自http://www.cnblogs.com/yanlingyin/ 当然.这是一个经典的递归问题~   想必来看这篇博文的同学对汉诺塔应该不会陌生了吧, 写这篇博还是有初衷的: 之前学数据结构的时候自己看书.也上网上查了很多资料,资料都比较散.而且描述的不是很清楚,对于当时刚刚 接触算法的我,要完全理解还是有一定难度.今天刚好有时间就整理了下思路.重写分析了一下之前的疑惑的地方. 没有透彻的地方便都豁然开朗了.所以迫不及待把我的想法记录下来,和大家分享. 如果你也是和之前

Hanoi Tower 汉诺塔问题/c

作为一个编程初学者,写下这些东西主要是为了加深自己的理解,当然如果能对各位有所帮助,是本人的荣幸.如有错误之处敬请指出. 问题描述: 有一个梵塔,塔内有三个座A.B.C,A座上有诺干个盘子,盘子大小不等,大的在下,小的在上(如图). 把这些个盘子从A座移到C座,中间可以借用B座但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘 子始终保持大盘在下,小盘在上. 描述简化:把A柱上的n个盘子移动到C柱,其中可以借用B柱. 我们假设有n个盘子,编号为:1,2,3,4……n. (请问:把大象装冰

Hanoi with Python

1 #coding:utf-8 2 def hanoi(n,x,y,z): 3 if(n==1): 4 print x,'-->',z 5 else: 6 hanoi(n-1,x,z,y)#将前n-1个盘子从x移动到y上 7 print x,'-->',z#将最底下的最后一个盘子从x移动到z 8 hanoi(n-1,y,x,z)#将y上的n-1个盘子移动到z上 9 10 hanoi(3,'x','y','z')

Hanoi汉诺塔问题

题目描述 Description 有N个圆盘,依半径大小(半径都不同),自下而上套在A柱上,每次只允许移动最上面一个盘子到另外的柱子上去(除A柱外,还有B柱和C柱,开始时这两个柱子上无盘子),但绝不允许发生柱子上出现大盘子在上,小盘子在下的情况,现要求设计将A柱子上N个盘子搬移到C柱去的方法. 输入输出格式 Input/output 输入格式:一行,n<=20输出格式: 步数及各种圆盘要移动的步骤 输入输出样例 Sample input/output 样例测试点#1 输入样例: 2 输出样例:

栈和递归之Hanoi塔

hanoi塔 代码 <pre name="code" class="cpp">#include<stdio.h> void move(char x,int n,char y) { static int k=1; printf("Step %d : %d from %c >>->> to %c \n",k++,n,x,y); } void hanoi(int n,char A,char B,char

One usage of recurison: the tower of Hanoi

Statements: This blog was written by me, but most of content  is quoted from book[Data Structure with Java Hubbard] [Description] we have seen important examples of functions that are more naturally defined and more easily understood by using recursi

汉诺塔问题(Hanoi)的C++代码实现

1 #include <iostream> 2 using namespace std; 3 //第一个塔为初始塔,第二个塔为中转塔,第三个塔为目标塔 4 5 int i = 1; //记录步数 6 void move(int n,char from,char to) //将编号为N的盘子由from塔转移到to塔 7 { 8 cout<<"第"<<i++<<"步:将"<<n<<"号盘子