Hanoi塔问题(C语言程序)

合集下载

{F3[n] 为Hanoi塔中3根柱子,n个盘子的最少移动次数

{F3[n] 为Hanoi塔中3根柱子,n个盘子的最少移动次数

现在要求把1柱上n个圆盘按下述规则移到m柱上: (1) 一次只能移一个圆盘; (2) 圆盘只能在m个柱上存放; (3) 在移动过程中,不允许大盘压小盘。
求将这n个盘子从1柱移动到m柱上所需要移动盘子的最少次数 。
问题Ⅰ:三柱问题
设f(n)为n 个盘子从1柱移到3柱所需移动的最少盘次。 当n=1时,f(1)=1。 当n=2时,f(2)=3。
r 1
(n 1)! (n r ) (n 1)!r n! r Cn C n1 C n1 r!(n r )! r!(n r )!
2、平面分割问题
问题Ⅰ
问题的提出:设有n条封闭曲线画在平面上,而任何两条封闭曲线恰好相交于两点,且 任何三条封闭曲线不相交于同一点,求这些封闭曲线把平面分割成的区域个数。
5 、其他: 1)‘集合取数问题 设f(n,k)是从集合{1,2,。。。,n}中能够选择的没有两个连续 整数的k个元素子集的数目,求递归式f(n,k)。
【问题分析】: N有两种情况: ① 当n在子集时,则n-1一定不在子集中,即在{1,2,。。。,n-2}中选 k-1个元素,数目为f(n-2,k-1)。 ② 当n不在子集中时,则在{1,2,。。。,n-1}中选k个元素,数目为 f(n-1,k)。 所以:f(n,k)= f(n-2,k-1) +f(n-1,k) 边界条件:F(n,1)=n, f(n,k)=0 ( n<=k)

汉诺塔问题C语言代码

汉诺塔问题C语言代码

#includevoid hanoi( int n , char A , char B , char C ){/* 如果是一个盘子直接将A柱子上的盘子从A移动到C否则先将A柱子上的n-1个盘子借助C移到B直接将A柱子上的盘子从A移到C最后将B柱子上的n-1个盘子借助A移到C */if ( 1 == n){printf("将编号为%d的盘子直接从%c柱子移到%c柱子\n" , n , A , C ) ;}else {hanoi( n-1 , A ,C ,B );printf("将编号为%d的盘子直接从%c柱子移到%c柱子\n" , n , A, C) ;hanoi( n -1 , B , A , C ) ; //继续进行汉诺塔函数}}int main (){char ch1 = 'A' ;char ch2 = 'B' ;char ch3 = 'C' ;int n ;printf("please input the number of plates wanting to move :\n") ;scanf("%d" ,&n) ;hanoi( n , 'A' , 'B' , 'C') ;return 0 ;}

【C语言程序设计】汉诺塔问题,用C语言实现汉诺塔!

【C语言程序设计】汉诺塔问题,用C语言实现汉诺塔!

【C语⾔程序设计】汉诺塔问题,⽤C语⾔实现汉诺塔!

汉诺塔问题是指:⼀块板上有三根针 A、B、C。A 针上套有 64 个⼤⼩不等的圆盘,按照⼤的在下、⼩的在上的顺序排列,要把这 64 个圆盘从 A 针移动到 C 针上,每次只能移动⼀个圆盘,移动过程可以借助 B 针。

但在任何时候,任何针上的圆盘都必须保持⼤盘在下,⼩盘在上。从键盘输⼊需移动的圆盘个数,给出移动的过程。

算法思想

对于汉诺塔问题,当只移动⼀个圆盘时,直接将圆盘从 A 针移动到 C 针。

若移动的圆盘为 n(n>1),则分成⼏步⾛:把 (n-1) 个圆盘从 A 针移动到 B 针(借助 C 针);A 针上的最后⼀个圆盘移动到 C 针;B 针上的 (n-1) 个圆盘移动到 C 针(借助 A 针)。

每做⼀遍,移动的圆盘少⼀个,逐次递减,最后当 n 为 1 时,完成整个移动过程。

因此,解决汉诺塔问题可设计⼀个递归函数,利⽤递归实现圆盘的整个移动过程,问题的解决过程是对实际操作的模拟。

程序代码

#include <stdio.h>

int main()

{

int hanoi(int,char,char,char);

int n,counter;

printf("Input the number of diskes:");

scanf("%d",&n);

printf("\n");

counter=hanoi(n,'A','B','C');

return0;

}

int hanoi(int n,char x,char y,char z)

{

int move(char,int,char);

C语言程序设计课程设计报告---汉诺塔问题

C语言程序设计课程设计报告---汉诺塔问题

XXXX大学

计算机科学与技术学院

课程设计报告

2012 — 2013学年第一学期

课程名称C/C++高级语言程序设计课程设计设计题目小游戏和图形处理

汉诺塔问题

学生姓名XXX

学号XXXXXXX

专业班级XXXXXXXXXXX

指导教师XX

2012 年X 月XX 日

目录

一、课程设计问题描述 (1)

1、课程设计题目 (1)

2、设计任务要求 (1)

二、总体设计 (1)

1、设计思路 (1)

2、汉诺塔求解流程图 (2)

三、详细设计 (2)

1、汉诺塔问题描述 (2)

2、算法分析 (3)

3、实现递归的条件 (4)

4、用C语言实现 (4)

四、程序运行结果测试与分析 (4)

1、打开Microsoft Visual C++ 6.0操作平台输入以下的源代码 (4)

2、编译源代码 (5)

3、组建 (5)

4、执行 (5)

5、运行结果 (6)

6、按任意键结束程序 (7)

五、结论与心得 (7)

六、参考文献 (8)

七、附录:程序源代码 (8)

一、课程设计问题描述

1、课程设计题目

汉诺塔问题

2、设计任务要求

输入盘子数(2个以上有效),移动速度,开始演示汉诺塔移动的步骤,要求:盘子A,B,C柱需要自己绘制,初始时盘子在A柱上通过B柱最终移动到C 柱上,显示出盘子在几个柱之间的移动过程。

二、总体设计

1、设计思路

对于一个类似的这样的问题,任何一个人都不可能直接写出移动盘子的每一个具体步骤。可以利用这样的统筹管理的办法求解:我们假设把该任务交给一个僧人,为了方便叙述,将他编号为64。僧人自然会这样想:假如有另外一个僧人能有办法将63个盘子从一个座移到另一个座,那么问题就解决了,此时僧人

(仅供参考)汉诺塔问题实验报告

(仅供参考)汉诺塔问题实验报告
Hanoi 塔问题的复杂性是以 n 为指数的函数,因此在可以接受的范 围内,只能解决 n 值比较小(n<=30)的 hanoi 问题。对于这个较 小的 n 值,堆栈在空间需求上的差别相当小,可以随意使用。
7、结论
通过对上述递归在 Hanoi 塔问题上的应用分析,我们可以得出如下 结论:
1、递归调用过程中,在程序执行之前无法知道控制这种调用栈的 规模,因为这一规模取决于递归调用的次序。在这种情况下,程序 的地址空间可能动态变化;
①将所有的实参、返回地址等信息传递给被调用函数保存。
②为被调用函数的局部变量分配存储区;
③将控制转移到被调用函数的入口。
从被调用函数返回调用函数前,系统也应完成 3 件事:
①保存被调用函数的结果;
②释放被调用函数的数据区;
③依照被调用函数保存的返回地址将控制转移到调用函数。
当有多个函数构成嵌套调用时,按照“后调用先返回”的原则 (LIFO),上述函数之间的信息传递和控制转移必须通过“栈”来 实现,即系统将整个程序运行时所需的数据空间安排在一个栈中, 每当调用一个函数时,就为其在栈顶分配一个存储区,每当从一个 函数退出时,就释放其存储区,因此当前运行函数的数据区必在栈
对于汉诺塔问题的求解,可以通过以下三个步骤实现: (1)将塔 A 上的 n-1 个碟子借助塔 C 先移到塔 B 上。 (2)把塔 A 上剩下的一个碟子移到塔 C 上。 (3)将 n-1 个碟子从塔 B 借助于塔 A 移到塔 C 上。 4.实验步骤:

四年级汉诺塔研究课题报告

四年级汉诺塔研究课题报告

一、概述

数据结构是计算机学科非常重要的一门专业基础理论课程,要想编写针对非数值计算问题的高质量程序,就必须要熟练的掌握这门课程设计的知识。另外,他与计算机其他课程都有密切联系,具有独特的承上启下的重要位置。拥有《数据结构》这门课程的知识准备,对于学习计算机专业的其他课程,如操作系统、数据库管理系统、软件工程的都是有益的。

二、实验目的

通过本实验,掌握复杂性问题的分析方法,了解汉诺塔游戏的时间复杂性和空间复杂性。

三、问题分析

任务:有三个柱子A,B,C.A柱子上叠放有n个盘子,每个盘子都比它下面的盘子要小一点,可以从上到下用1,2?,n编号。要求借助柱子B,把柱子A上的所有的盘子移动到柱子C移动条件为:1、一次只能移一个盘子;

2、移动过程中大盘子不能放在小盘子上,只能小盘子放在大盘子上。

分析:首先容易证明,当盘子的个数为n时,移动的次数应等于2n-1。

首先把三根柱子按顺序排成品字型,把所有的圆盘按从大到小的顺序放在柱子A上。根据圆盘的数量确定柱子的排放顺序:若n为偶数,按顺时针方向依次摆放A BC;若n为奇数,按顺时针方向依次摆放ACB。

(1)按顺时针方向把圆盘1从现在的柱子移动到下一根柱子,即当n为偶数时,若圆盘1在柱子A,则把它移动到B;若圆盘1在柱子B,则把它移动到C;若圆盘1在柱子C,则把它移动到A。

(2)接着,把另外两根柱子上可以移动的圆盘移动到新的柱子上。

即把非空柱子上的圆盘移动到空柱子上,当两根柱子都非空时,移动较小的圆盘这一步没有明确规定移动哪个圆盘,你可能以为会有多种可能性,其实不然,可实施的行动是唯一的。

数据结构(第一、二、三组答案)

数据结构(第一、二、三组答案)

考试科目:数据结构

第一组:

一、编程题(每小题30分,共60分)

(一)

用标准C语言实现Hanoi塔问题

#include

#include

void move(int n,char x,char y,char z) {

if (n==1) {

printf("%c--->%c\n",x,z);

}else {

move(n-1,x,z,y);

printf("%c--->%c\n",x,z);

move(n-1,y,x,z);

}

}

int main()

{

int n;

scanf("%d",&n);

move(n,'X','Y','Z');

return 0;

}

(二)

1.设单链表中有仅三类字符的数据元素(大写字母、数字和其它字符),要求利用原单链表中结点空间设计出三个单链表的算法,使每个单链表只包含同类字符。

2.设计在链式存储结构上交换二叉树中所有结点左右子树的算法。

二、解答题(20分)

(一)

已知一棵二叉树的先序序列是ABCDEFGHIJK,中序序列是CDBGFEAHJIK,请构造出该二叉树。

三、画图题(20分)

(一)

设有序顺序表中的元素依次为017, 094, 154, 170, 275,503, 509, 512, 553, 612, 677, 765, 897, 908。试画出对其进行折半搜索时的判定树, 并计算搜索成功的平均搜索长度和

搜索不成功的平均搜索长度。

第二组:

一、编程题(每小题30分,共60分)

(一)

已知某哈希表的装载因子小于1,哈希函数H(key)为关键字(标识符)的第一个字母在字母表中的序号,处理冲突的方法为线性探测开放定址法。试编写一个按第一个字母的顺序输出哈希表中所有关键字的算法。

c语言汉诺塔问题递归算法

c语言汉诺塔问题递归算法

c语言汉诺塔问题递归算法

汉诺塔问题是经典的递归问题,要求将n个大小不同的盘子从起始柱移动到目标柱,并遵循以下规则:

1.大盘子不能在小盘子上方移动。

2.每次只能移动一个盘子。

在C语言中,我们可以使用递归算法来解决汉诺塔问题。以下是一个简单的示例代码:

```c

#include<stdio.h>

voidhanoi(intn,charfrom,charto,charaux){

if(n==1){

//只有一个盘子时,直接移动到目标柱

printf("Movedisk1from%cto%c\n",from,to);

}else{

//递归地将n-1个盘子从起始柱移动到辅助柱,再将最后一个盘子从起始柱移动到目标柱

hanoi(n-1,from,aux,to);

printf("Movedisk%dfrom%cto%c\n",n,from,to);

hanoi(n-1,aux,to,from);

}

}

intmain(){

intn;

printf("Enterthenumberofdisks:");

scanf("%d",&n);

hanoi(n,'A','C','B');//从起始柱A开始,目标柱C,辅助柱B

return0;

}

```

在上述代码中,我们定义了一个名为hanoi的函数,用于实现汉诺塔问题的递归解法。该函数接受四个参数:n表示盘子的数量,from表示起始柱,to表示目标柱,aux表示辅助柱。当只有一个盘子时,直接移动到目标柱;否则,我们通过递归调用将n-1个盘子从起始柱移动到辅助柱,再将最后一个盘子从起始柱移动到目标柱。在主函数中,我们从用户输入获取盘子的数量,并调用hanoi函数开始解决问题。

对汉诺塔(Hanoi)问题的算法探索与研究

对汉诺塔(Hanoi)问题的算法探索与研究

1 问题分析与算法设 计
汉诺塔 ( Ha n o i )问题是一个著名的问题。6 4个 圆盘 按从
小 到大 的顺序依次套在柱 x 上,如图 1 所示。规定每次只能从

根柱子上搬动一个 圆盘到另一根柱子上,且要求在搬动过程
中不许大盘放 在小盘 上,且只有 x 、Y 、z 三根柱子可供使用。
Abs t r a c t : The a l g o r i t h m o f t h e T o we r o f Ha n o i pr o b l e m i s c o n c r e t e l y a n a l y z e d , a n d f o u r d i f f e r e n t k i nd s o f c l a s s i c a l a l g o r i t h m wa s pr e s e n t e d, S O a s t o i ns p i r e t h e l e a r ne r s ’e x pl o r i n g e n t h us i a s m t o t h e n e w a l g o r i t hm o fc l a s s i c To we r o f Ha n o i . Ke ywor ds : T o we r o f Ha n o i ; pr o bl e m a na l ys i s ; a l g o r i t h m de s i g n ; i mp l e me n t a t i o n pr o gr a me

hanoi塔问题

hanoi塔问题

源轴
辅助轴
wk.baidu.com
目的轴
n (1 ~ n)
n-1(1~n-1)
A A A B
B C
C B C
1(n)
n-1(1~n-1)
A
C
C语言程序设计
Hanio塔问题
hanoi( n, one , two , three )
1: … 2: 输入n=3, if ( n==1 ) 将one轴上的圆盘移到three轴; 1: 输出结果为 : else 3: { hanio( n-1, one, three, two ) ; 1: 将第 n 号圆盘由 one 轴移动到 three 轴 ; 2: hanio( n-1, two, one, three ) ; 1: } …
Hanio塔问题
归纳上述过程, 得到如下步骤: 归纳上述过程 得到如下步骤 ① 从 A 轴移动 1~n-1 号圆盘到B 轴, C 轴作辅助存放之用 ; ② 从 A 轴移动 n 号圆盘到 C 轴 ; ③ 从 B 轴移动 1~n-1 号圆盘到 C 轴, A 轴作辅助存放之用 ;
移动 圆盘数 总任务 子任务① 子任务① 子任务② 子任务② 子任务③ 子任务③
C语言程序设计
Hanio塔问题
Hanio塔问题:
1. 游戏起源: 世界末日游戏 2. 游戏规则: ① 每次只能移动一只圆盘 ; ② 任何时候大圆盘不能压在小圆盘之上 ; ③ 任何时候都不允许将圆盘放在三根立轴之外的任 何地方 ; 3.分析: A C B

hanoi塔递归算法

hanoi塔递归算法

hanoi塔递归算法

Hanoi塔递归算法

Hanoi塔是一个经典的数学问题,它的解法可以用递归算法来实现。在这篇文章中,我们将介绍Hanoi塔问题的背景和递归算法的实现。

Hanoi塔问题的背景

Hanoi塔问题是一个源于印度的传统数学问题,它的名字来源于印度的一个城市哈诺伊。这个问题的描述如下:

有三个柱子,分别为A、B、C,A柱子上有n个盘子,盘子大小不一,大的在下面,小的在上面。现在要将A柱子上的所有盘子移动到C柱子上,移动过程中可以借助B柱子,但是要满足以下规则:

1.每次只能移动一个盘子;

2.大盘子不能放在小盘子上面。

这个问题看起来很简单,但是实际上它是一个非常复杂的问题。当盘子数量较少时,我们可以手动模拟移动过程,但是当盘子数量增加时,手动模拟就变得非常困难。因此,我们需要一种更加高效的算法来解决这个问题。

递归算法的实现

递归算法是一种非常常见的算法,它的基本思想是将一个大问题分解成若干个小问题,然后逐个解决这些小问题,最终得到大问题的解。在Hanoi塔问题中,我们可以使用递归算法来解决这个问题。

我们需要定义一个函数来实现移动盘子的操作。这个函数需要接受三个参数:起始柱子、目标柱子和盘子数量。函数的实现如下:

```

void move(int start, int end, int num)

{

if (num == 1)

{

cout << "Move disk " << num << " from " << start << " to " << end << endl;

Hanoi(汉诺)塔问题

Hanoi(汉诺)塔问题

将1个盘子从A移到B
A
B
C
11:59
26
将2个盘子从A移到B的过程
将1个盘子从A移到B
A
B
C
11:59
27
将2个盘子从A移到B的过程
将1个盘子从C移到B
A
B
C
11:59
28
将2个盘子从A移到B的过程
将1个盘子从C移到B
A
B
C
11:59
29
将2个盘子从B移到C的过程
A
B
C
11:59
30
将2个盘子从B移到C的过程
11:59
37
#include <stdio.h> int main() { void hanoi(int n,char one, char two,char three); int m; printf(“the number of diskes:"); scanf("%d",&m); printf("move %d diskes:\n",m); hanoi(m,'A','B','C'); }
11:59
34
• 可以将第(1)步和第(3)步表示为:
– 将“one”座上n-1个盘移到“two”座(借助“three” 座)。 – 在第(1)步和第(3)步中,one 、two、three 和A、B、C的对应关系不同。 – 对第(1)步,对应关系是one对应A,two对 应B,three对应C。 – 对第(3)步,对应关系是one对应B,two对 应C,three对应A。

C语言递归调用实例——汉诺塔问题动画实现(附完整代码)

C语言递归调用实例——汉诺塔问题动画实现(附完整代码)
3
个圆盘的移动操作。 不过这好像并不影响我们对其进行学习和探索,我们只需要将圆盘的
个数 n 的值设得稍微小一些(以便我们能够在有生之年看到程序的最终运 行结果),就可以了。
好了,闲话少说,先上图(虽然是实现了动画效果,但是文档里面不 能放动图,所以这里仅以三张不同时间节点下的截图来表示)。
图 1-1 移动第一个圆盘
1
4.4 GUI.h................................................................................................................................................ 36 4.4 GUI.cpp ........................................................................................................................................... 37 4.5 LinkedStack.h................................................................................................................................. 41 4.6 LinkedStack.cpp............................................................................................................................ 43

07141326汉诺塔-课程设计

07141326汉诺塔-课程设计

07141326汉诺塔-课程设计

汉诺塔课程设计

报告

⽬录

⼀、需求分析 (3)

⼆、概要设计 (4)

三、详细设计 (6)

四、测试与分析 (7)

五、总结 (7)

六、附录:源程序清单 (8)

⼀、需求分析

1.1问题描述

汉诺塔(⼜称河内塔)问题是印度的⼀个古⽼的传说。开天辟地的神勃拉玛在⼀个庙⾥留下了三根⾦刚⽯的棒,第⼀根上⾯套着64个圆的⾦⽚,最⼤的⼀个在底下,其余⼀个⽐⼀个⼩,依次叠上去,庙⾥的众僧不倦地把它们⼀个个地从这根棒搬到另⼀根棒上,规定可利⽤中间的⼀根棒作为帮助,但每次只能搬⼀个,⽽且⼤的不能放在⼩的上⾯。

这是⼀个著名的问题,⼏乎所有的教材上都有这个问题。由于条件是⼀次只能移动⼀个盘,且不允许⼤盘放在⼩盘上⾯,所以64个盘的移动次数是:

18,446,744,073,709,551,615

这是⼀个天⽂数字,若每⼀微秒可能计算(并不输出)⼀次移动,那么也需要⼏乎⼀百万年。我们仅能找出问题的解决⽅法并解决较⼩N值时的汉诺塔,但很难⽤计算机解决64层的汉诺塔。

后来,这个传说就演变为汉诺塔游戏:

1.有三根杆⼦A,B,C。A杆上有若⼲圆盘

2.每次移动⼀块圆盘,⼩的只能叠在⼤的上⾯

3.把所有圆盘从A杆全部移到C杆上

经过研究发现,汉诺塔的破解很简单,就是按照移动规则向⼀个⽅向移动圆盘:如3阶汉诺塔的移动:

A→C,A→B,C→B,A→C,B→A,B→C,A→C

此外,汉诺塔问题也是程序设计中的经典递归问题。

将n个盘⼦从a座移动到c座可以分解为以下3个步骤:

(1)将a上n-1个盘借助c座先移到b座上。

(2)把a座剩下的⼀个盘移到c座上。

递归基础练习题

递归基础练习题

递归基础练习题

递归基础练习题

1. 求1+2+3+……+n的值

2. 求1*2*3*……*n的值

3. 数的全排列问题。将n个数字1,2,…n的所有排列按字典顺序枚举出来

2 3 1

2 1 3

3 1 2

3 2 1

4. 数的组合问题。从1,2,…,n中取出m个数,将所有组合按照字典顺序列出。

如n=3,m=2时,输出:

1 2

1 3

2 3

9. 求两个数的最大公约数。

10. 求两个数的最小公倍数。

5. 小猴子第一天摘下若干桃子,当即吃掉一半,又多吃一个.第二天早上又将剩下的桃子吃一半,又多吃一个.以后每天早上吃前一天剩下的一半另一个.到第10天早上猴子想再吃时发现,只剩下一个桃子了.问第一天猴子共摘多少个桃子?

8. 著名的菲波拉契(Fibonacci)数列,其第一项为1,第二项为1,从第三项开始,其每一项都是前两项的和。编程求出该数列前N项数据。15. 梯有N阶,上楼可以一步上一阶,也可以一次上二阶。编一个程序,计算共有多少种不同的走法。

6. 有雌雄一对兔子,假定过两个月便可繁殖雌雄各一的一对小兔子。问过n个月后共有多少对兔子?

7. 一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?

11. 输入一个数,求这个数的各位数字之和。

12. 角谷定理。输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。求经过多少次可得到自然数1。

如:输入22,

hanoi塔递归算法c语言

hanoi塔递归算法c语言

hanoi塔递归算法c语言

Hanoi塔是一种经典的数字益智游戏,它来源于法国数学家Lucas的BrainVita游戏,被称为“汉诺威塔问题”或“汉诺塔问题”。该游戏由三个柱子和几个圆盘组成,最初时,圆盘按半径从大到小依次放在一个柱子上(逆序排列),游戏的目标则是将这些圆盘移动到另一个柱子上,最终使得其按半径从小到大依次排列。在移动整个圆盘的过程中,必须遵循以下规定:

1. 每次只能移动一个圆盘;

2. 圆盘可以放置在任何柱子上;

3. 不能将一个大的圆盘放在较小的圆盘之上。

为了解决这一难题,Hanoi塔问题引入了递归算法,这也是大多数编程语言中最常使用的算法之一。在C语言中,Hanoi塔问题可以用以下代码实现:

```c

#include<stdio.h>

void move(int n, char x, char y, char z)

{

if(n == 1)

{

printf("%c-->%c\n", x, z);

}

else

{

move(n-1, x, z, y);

printf("%c-->%c\n", x, z);

move(n-1, y, x, z);

}

}

int main()

{

int n;

printf("请输入盘子数:");

scanf("%d", &n);

printf("移动的步骤如下:\n");

move(n, 'A', 'B', 'C');

return 0;

}

```

在这个程序中,我们首先定义了一个函数`move()`,该函数接受四个参数:圆盘的数量`n`和字母标识符`x`、`y`、`z`,它们分别代表三个柱子。在函数中,我们使用了条件判断语句,如果只有一个圆盘,我们直接将其从柱子`x`移动至柱子`z`上。否则,我们需要进行3个步骤:

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

// algo3-10.cpp Hanoi塔问题,调用算法3.5的程序

#include

int c=0; // 全局变量,搬动次数

void move(char x,int n,char z)

{ // 第n个圆盘从塔座x搬到塔座z

printf("第%i步: 将%i号盘从%c移到%c\n",++c,n,x,z);

}

void hanoi(int n,char x,char y,char z) // 算法3.5

{ // 将塔座x上按直径由小到大且自上而下编号为1至n的n个圆盘

// 按规则搬到塔座z上。y可用作辅助塔座

if(n==1)

move(x,1,z); // 将编号为1的圆盘从x移到z

else

{

hanoi(n-1,x,z,y); // 将x上编号为1至n-1的圆盘移到y,z作辅助塔

move(x,n,z); // 将编号为n的圆盘从x移到z

hanoi(n-1,y,x,z); // 将y上编号为1至n-1的圆盘移到z,x作辅助塔

}

}

int main()

{

int n;

printf("3个塔座为a、b、c,圆盘最初在a座,借助b座移到c座。请输入圆盘数:"); scanf("%d",&n);

hanoi(n,'a','b','c');

}

相关文档
最新文档