汉诺塔(非递归)

合集下载

汉诺塔问题非递归算法

汉诺塔问题非递归算法

汉诺塔问题非递归算法汉诺塔(Hanoi)问题,又称为汉诺塔游戏,是一种数学问题,源自印度传说。

它主要涉及把一堆圆盘,从一个柱子上移动到另一个柱子上的规则和方法。

在这篇文章中,我们将介绍汉诺塔问题的非递归算法,即利用迭代实现移动圆盘的操作。

汉诺塔问题的规则很简单:给定三个柱子,分别标记为源柱子(A)、辅助柱子(B)和目标柱子(C)。

开始时,所有的圆盘都放置在源柱子上,按从大到小的顺序堆叠。

目标是将所有圆盘从源柱子上移到目标柱子上,期间可以借助辅助柱子。

但是,有以下限制条件:1. 每次只能移动一个圆盘;2. 大圆盘不能放在小圆盘上面。

接下来,我们将详细介绍如何使用非递归算法来解决汉诺塔问题。

首先,我们可以观察到移动圆盘的规律:1. 如果只有一个圆盘,直接将其从源柱子移动到目标柱子上即可;2. 如果有两个圆盘,先将较小的圆盘从源柱子移动到辅助柱子上,再将较大的圆盘从源柱子移动到目标柱子上,最后将较小的圆盘从辅助柱子移动到目标柱子上。

根据以上规律,我们可以推导出非递归算法的步骤:步骤一:定义一个栈,用于存储每一步的操作。

首先将开始状态(源柱子、辅助柱子、目标柱子)入栈。

步骤二:当栈不为空时,执行以下操作:1. 弹出栈顶元素,即当前状态;2. 如果只有一个圆盘需要移动,直接移动该圆盘到目标柱子,并将该状态出栈;3. 如果有多个圆盘需要移动,根据汉诺塔的规则,推导出下一个状态(包括源、辅助和目标柱子的变化),并将该状态入栈。

步骤三:重复步骤二,直到栈为空。

通过以上步骤,我们可以实现汉诺塔问题的非递归算法。

以下是一个示例代码:```pythondef hanoi(n, source, auxiliary, target):stack = []stack.append((n, source, auxiliary, target)) # 步骤一while stack:disks, source, auxiliary, target = stack.pop() # 步骤二 - 弹出当前状态if disks == 1: # 只有一个圆盘需要移动print(f"Move disk 1 from {source} to {target}")else:stack.append((disks-1, auxiliary, source, target)) # 推导下一个状态并入栈stack.append((1, source, auxiliary, target)) # 推导下一个状态并入栈stack.append((disks-1, source, target, auxiliary)) # 推导下一个状态并入栈# 在此处输入汉诺塔的初始状态和圆盘数量n = int(input("请输入圆盘的数量:"))hanoi(n, 'A', 'B', 'C')```以上示例中,我们使用了一个栈来模拟递归的过程,并根据汉诺塔问题的规律,不断推导下一个状态,并将其入栈。

python汉诺塔非递归算法

python汉诺塔非递归算法

python汉诺塔非递归算法如何使用Python编写非递归的汉诺塔算法首先,让我们回顾一下汉诺塔问题的背景。

汉诺塔是一个经典的数学问题,涉及到递归和栈的使用。

问题的目标是将一组不同大小的圆盘从一个柱子移动到另一个柱子,其中有三个柱子可供选择。

在移动过程中,您必须遵守以下规则:1. 您只能移动一个圆盘,并且只能将较小的圆盘放在较大的圆盘上。

2. 您只能在三个柱子之间移动圆盘。

3. 将所有圆盘从一个柱子移动到另一个柱子上是成功的。

使用递归算法可以很容易地解决这个问题。

然而,递归算法在处理大量圆盘时可能会导致递归深度过大,从而消耗大量的内存和计算时间。

因此,我们需要采用非递归的方法来解决这个问题。

接下来,让我们一步一步地介绍如何使用Python编写非递归的汉诺塔算法:步骤1: 定义一个Stack类首先,我们需要定义一个Stack类来模拟栈的行为。

在Python中,可以使用列表来实现这个类。

我们可以使用列表的append()方法将元素添加到栈顶,使用pop()方法从栈顶取出元素,使用isEmpty()方法检查栈是否为空,以及使用size()方法获取栈的大小。

下面是Stack类的代码实现:class Stack:def __init__(self):self.items = []def isEmpty(self):return len(self.items) == 0def push(self, item):self.items.append(item)def pop(self):return self.items.pop()def size(self):return len(self.items)步骤2: 定义一个非递归的汉诺塔函数接下来,我们需要定义一个非递归的汉诺塔函数。

该函数的输入参数包括圆盘的数量、起始柱子、目标柱子和辅助柱子。

函数的实现思路如下:- 首先,将所有的圆盘按照倒序从起始柱子压入起始栈。

采用递归和非递归方法求解hannol问题

采用递归和非递归方法求解hannol问题

采用递归和非递归方法求解hannol问题汉诺塔问题是数学中的经典问题之一,也被认为是计算机科学中的经典问题。

它的解法可以使用递归或非递归的方法。

在本文中,我们将介绍并比较这两种解法。

汉诺塔问题的描述是:有三根柱子,A、B、C,初始时,A柱子上有n个盘子,这些盘子从小到大按顺序堆叠在一起。

现在需要将这n 个盘子从A柱子移动到C柱子上,期间可以借助B柱子。

移动盘子有以下几个规则:1.每次只能移动一个盘子;2.盘子只能从大盘子移到小盘子上;3.在移动过程中,可以借助柱子进行中转。

接下来,我们将先介绍递归解法。

递归解法:对于n个盘子,我们可以将问题分解为以下三个步骤:1.将n-1个盘子从A柱子移动到B柱子;2.将第n个盘子从A柱子移动到C柱子;3.将n-1个盘子从B柱子移动到C柱子。

递归解法的代码如下:```pythondef hanoi(n, A, B, C):if n == 1:print("Move disk %d from %s to %s" % (n, A, C)) else:hanoi(n-1, A, C, B)print("Move disk %d from %s to %s" % (n, A, C)) hanoi(n-1, B, A, C)```在这个递归函数中,n表示盘子的数量,A、B、C表示三根柱子。

当n为1时,直接将第一个盘子从A柱子移动到C柱子;否则,先将n-1个盘子从A柱子移动到B柱子,然后将第n个盘子从A柱子移动到C柱子,最后将n-1个盘子从B柱子移动到C柱子。

递归的过程中,会不断地将问题分解为子问题,直到子问题规模减小到1。

下面是一个具体的例子,假设有3个盘子,初始时都在A柱子上:```pythonhanoi(3, 'A', 'B', 'C')```输出结果为:```Move disk 1 from A to CMove disk 2 from A to BMove disk 1 from C to BMove disk 3 from A to CMove disk 1 from B to AMove disk 2 from B to CMove disk 1 from A to C```如上所示,递归解法将问题分解为子问题,然后逐步解决子问题,最后得到整体的解。

Hanoi塔问题递归与非递归的...

Hanoi塔问题递归与非递归的...

Hanoi塔问题递归与非递归的...Hanoi塔问题的递归与非递归算法等价性证明[1]递归算法:Hanoi塔问题递归算法的简单描述如下:假设要解决的汉诺塔共有n个圆盘,对a塔上的全部n个圆盘从小到大顺序编号,最小的圆盘为1号,次之为2号,依次类推,则最下面的圆盘的编号为N。

第一步:若a塔上只有一个圆盘,即汉诺塔只有一层,则只需将这个盘从a塔上移到b塔上即可;第二步:对于一个有n(n>1)个圆盘的汉诺塔,将n个圆盘分成两部分:上面的n-1个圆盘和最下面的n号圆盘。

解决n个圆盘的汉诺塔,可以按下面的方式进行操作:1、将a塔上面的n-1个圆盘,借助b塔,移到c塔上;2、将a塔上剩余的n号盘子移到b塔上;3、将c塔上的n-1个盘子,借助a塔,移到b塔上。

void hannoi(int n,int a,int b,int c){if(n>0){hannoi(n-1,a,c,b);move(x,n,z) ;hannio(n-1,c,b,a);}}[2]非递归算法:名词解释第一类环:最小的那个圆环,就是在移动之前处在唯一有圆环的杆上最高位置的那个圆环。

第一类移动:第一类环的移动,就是第一类移动。

有用性结论1、在实现汉诺塔移动的过程中,第一类移动和非第一类移动交替出现。

2、第一类移动在一次移动中,要移动到的位置不会是上一次第一类移动移动之前圆环的位置。

换句话说,在只有三个杆的情况下,第一类移动是循环进行的。

算法思路1、n个圆盘的汉诺塔实现过程正好是2n步(用数学归纳法极易证明)。

2、由于第一步肯定是第一类移动,所以循环执行第奇数次时,都是第一类移动。

若将三个杆分别编为a、b、c,则第一类移动是从a杆移动到c杆,则当n为奇数时,第一类移动的次序为a到c到b 再回到a的循环。

当n为偶数时,第一类移动的次序为a到b到c再回到a的循环。

3、循环执行第偶数次时,都是非第一类移动。

比较三个杆的顶端的圆环,将两个顶端较大的圆环中较小的小圆环移动到顶端圆环最大的杆上即可。

采用递归和非递归方法求解hanoi问题

采用递归和非递归方法求解hanoi问题

标题:探秘汉诺塔问题:递归与非递归方法的比较在计算机算法中,汉诺塔(Hanoi)问题是一个经典且富有挑战性的谜题,它涉及到如何将一个由大小各异的圆盘组成的塔从柱子A移动到柱子C,并且要求任何时刻都不应该出现较大的圆盘在较小的圆盘上方。

为了解决这一问题,人们提出了递归和非递归两种方法。

通过本文,我们将从深入和广度两个方面来探讨这一问题的解决方法,使读者更好地理解递归与非递归方法的差异和适用场景,并对汉诺塔问题有一个更全面的认识。

一、递归方法1. 递归思想的引入让我们从递归思想的引入开始。

递归,顾名思义,即“重复”。

在编程中,递归是指一个函数不断地调用自身的情况。

在解决汉诺塔问题中,递归方法非常值得我们深入探讨。

当我们要将N个圆盘从A柱移动到C柱时,可以将问题简化为三个子问题:首先将N-1个圆盘从A 柱移动到B柱;然后将第N个圆盘从A柱移动到C柱;最后将N-1个圆盘从B柱移动到C柱。

2. 递归方法的优点与缺点递归方法的优点在于,它能够将大问题简化为小问题,从而使问题的求解更加清晰和直观。

但是,递归方法也存在一些缺点,比如递归深度过深容易导致栈溢出,而且递归调用相对比较耗费内存,因此在处理大规模数据时效率不高。

针对这些缺点,非递归方法应运而生。

二、非递归方法1. 非递归方法的引入和优势相对于递归方法,非递归方法更加直接和高效。

在汉诺塔问题中,我们可以利用栈这一数据结构来模拟递归调用的过程,从而降低内存消耗并提高运行效率。

非递归方法的引入,使得我们能够更好地理解问题的求解过程,并且在实际应用中更加灵活。

2. 非递归方法的具体实现和比较比较递归和非递归方法的实现,我们发现非递归方法最大的优势在于对内存的更加有效利用和运行效率的提升。

在实际操作中,非递归方法无疑更加适合处理大规模的数据,比如涉及到大量圆盘的汉诺塔问题。

然而,非递归方法的实现相对比较复杂,需要对栈这一数据结构有一定的理解和掌握。

结语通过本文的探讨,我们对递归与非递归方法在求解汉诺塔问题中的应用有了更加深入和全面的理解。

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

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

汉诺塔问题非递归算法c语言汉诺塔问题是一个经典的数学问题,也是一个常见的编程练习题。

在这个问题中,有三根柱子和一些圆盘,圆盘的大小不一,从小到大依次叠放在一根柱子上。

目标是将所有的圆盘从一根柱子移动到另一根柱子,移动过程中要保证大的圆盘在小的圆盘上面。

同时,每次只能移动一个圆盘,且不能把一个大的圆盘放在一个小的圆盘上面。

在解决汉诺塔问题时,通常采用递归算法。

但是递归算法的效率并不高,因为每次递归都会产生额外的函数调用,增加了系统的开销。

因此,我们可以通过非递归的方式来解决汉诺塔问题,提高算法的效率。

以下是一个用C语言实现的汉诺塔问题的非递归算法:```c#include <stdio.h>#include <stdlib.h>typedef struct {int n;char start, end, temp;} StackNode;typedef struct {StackNode data[100];int top;} Stack;void push(Stack *s, StackNode node) {s->data[s->top++] = node;}StackNode pop(Stack *s) {return s->data[--s->top];}void hanoi(int n, char start, char end, char temp) {Stack s;s.top = 0;StackNode node;node.n = n;node.start = start;node.end = end;node.temp = temp;push(&s, node);while (s.top > 0) {node = pop(&s);if (node.n == 1) {printf("Move disk 1 from %c to %c\n", node.start, node.end); } else {StackNode node1, node2, node3;node1.n = node.n - 1;node1.start = node.temp;node1.end = node.end;node1.temp = node.start;push(&s, node1);node2.n = 1;node2.start = node.start;node2.end = node.end;node2.temp = node.temp;push(&s, node2);node3.n = node.n - 1;node3.start = node.start;node3.end = node.end;node3.temp = node.temp;push(&s, node3);}}}int main() {int n;printf("Enter the number of disks: "); scanf("%d", &n);hanoi(n, 'A', 'C', 'B');return 0;}```在这个非递归算法中,我们使用了一个栈来模拟递归的过程。

非递归汉诺塔

非递归汉诺塔

非递归汉诺塔1 运行截图2 解释栈的数据定义typedef struct {int N; /* 盘数*/char A; /* 起始柱*/char B; /* 借助柱*/char C; /* 目标柱*/} ElementType; /* 汉诺塔问题结构类型*/typedef struct {ElementType Data[MaxSize];int Top;} Stack; /* 堆栈的标准定义*/栈存储了maxsize个elementype 类型的数据,同时定义了栈顶所在位置。

3 解释入栈出栈操作void Push( Stack *PtrS, ElementType item ){ /* 入栈操作*/if ( PtrS->Top == MaxSize-1 ) {printf("堆栈满");return;}else {PtrS->Data[++(PtrS->Top)] = item;return;}}入栈操作,首先判断栈是否已满,如果栈不满则将top指针现在所处位置放入待入栈元素,top加一。

ElementType Pop( Stack *PtrS ){if ( PtrS->Top == -1 ) {printf("堆栈空");return ERROR; /* ERROR是ElementType的特殊值,标志错误*/}else {PtrS->Top --;return ( PtrS->Data[PtrS->Top+1] );}}出栈操作,首先判断栈是否为空,如果不为空就返回当前栈顶元素,并将top减一。

4 非递归汉诺塔的实现根据汉诺塔的递归算法可以将解决汉诺塔问题简单的分为三个步骤:(1)把n-1个盘子由A 移到B;(2)把第n个盘子由A移到C;(3)把n-1个盘子由B 移到C;那么根据这个过程可以设计非递归算法。

初始化栈后,第二个待解决子问题是将n-1个盘子由A移动到B,然后将第n个盘子从A移动到C,最后将n-1个盘子由B移动到C。

汉诺塔python代码

汉诺塔python代码

汉诺塔python代码汉诺塔游戏是一种经典的益智游戏,它的规则非常简单,但是解决这个问题却需要一定的思维能力,而且它还可以通过编程来实现。

Python是一门非常流行的编程语言,因此在这里我们将介绍如何使用Python来实现汉诺塔游戏。

一、汉诺塔游戏的规则汉诺塔游戏有三个柱子和若干个盘子,每个盘子大小不同。

开始时,所有盘子都放在一个柱子上,按照从大到小的顺序排列。

目标是将所有盘子从起始柱子移动到目标柱子上,并保持原来的顺序不变。

在移动过程中必须遵守以下规则:1. 每次只能移动一个盘子;2. 盘子只能放在比它大的盘子上面;3. 不能将一个大盘子放在一个小盘子上面。

二、使用递归算法实现汉诺塔游戏递归算法是解决汉诺塔问题最常用的方法之一。

下面我们将介绍如何使用递归算法来实现汉诺塔游戏。

1. 定义函数首先我们需要定义一个函数来实现汉诺塔游戏。

在这个函数中,我们需要传入三个参数:起始柱子、目标柱子和盘子的数量。

def hanoi(start, target, n):2. 判断递归结束条件在递归过程中,我们需要判断递归结束的条件。

当n等于1时,表示只有一个盘子需要移动,此时我们可以直接将它从起始柱子移动到目标柱子上。

if n == 1:print(start, "->", target)3. 递归调用如果n大于1,则需要进行递归调用。

首先我们需要将n-1个盘子从起始柱子移动到辅助柱子上,然后再将最后一个盘子从起始柱子移动到目标柱子上,最后将n-1个盘子从辅助柱子移动到目标柱子上。

else:hanoi(start, other, n-1)print(start, "->", target)hanoi(other, target, n-1)4. 完整代码下面是完整的使用递归算法实现汉诺塔游戏的Python代码:def hanoi(start, target, n):if n == 1:print(start, "->", target)else:other = 6 - start - targethanoi(start, other, n-1)print(start, "->", target)hanoi(other, target, n-1)hanoi(1, 3, 3)三、使用非递归算法实现汉诺塔游戏除了递归算法,我们还可以使用非递归算法来实现汉诺塔游戏。

汉诺塔非递归算法研究

汉诺塔非递归算法研究

( , , ,) 结 果 是 :- 2 1- ,— 3 1 2 3 13 2 1- 。 3 13 2 的 1- ,- 3 2 ,— ,— ,— ,- 2 -  ̄ -  ̄ -  ̄
1 汉诺塔 问题经典递归算法
汉诺塔问题假 设有三根柱子 , 编号为 12 3 开始 时 1柱上 、、, 有 n个 圆盘 , 圆盘从 底 向上 、 由大 到小叠在一起 , 目标 是将所有
Ab t a t sr c T we fHo o rb e a ls ia n tn e o e u sv r g a o ro n ip o lm sa ca s li s c frc rie p o r mmi g wa rv d e s o o e f w wh n r n t e ag r h c a n sp o e a y t v r o e l h loi m l l t
维普资讯
第2 5卷 第 5期
20 0 8年 5月
计算机 应 用与软 件
Co u e pi ai n n o wa e mp tr Ap l to s a d S f r c t
Vo . 5 No 5 12 .
Ma 0 v 2 08
圆盘 从 1柱 移 到 3柱 , 按 同 样 顺 序 叠 放 。 移 动 过 程 中 可 以 使 并
经 典 递 归算 法 的 问题 是 当 n取 大数 时 , 归 调 用 导 致 溢 出 。 递
汉诺 塔 非递 归算 法研 究
赵 东 跃
( 福州 大 学 工 程 技 术 学 院 福建 福州 300 ) 5 0 2
摘 要
汉诺 塔 ( o e f ao) T w r ni 问题 是 求 在 三 个柱 子 之 间 移 动 圆盘 的 方 法 , 是 递 9程 序 设 计 的 经 典 例 子 , oH 它 3 - 已经 证 明 其 时 间 复

汉诺塔问题算法思路

汉诺塔问题算法思路

汉诺塔问题算法思路
汉诺塔问题是一个经典的数学问题,要求将一堆大小不同的圆盘从柱子A移动到柱子C,其中每一次移动都需要满足以下条件:
1. 每次只能移动一个圆盘;
2. 大的圆盘不能放在小的圆盘上面。

如何实现这个问题的算法呢?以下是一些思路:
1. 递归算法
最常见的解决汉诺塔问题的方法就是递归。

我们可以将问题分解为三个步骤:
(1) 将n-1个圆盘从起始柱子A经过辅助柱子B移动到目标柱子C;
(2) 将最大的圆盘从起始柱子A移动到目标柱子C;
(3) 将n-1个圆盘从辅助柱子B经过起始柱子A移动到目标柱子C。

这个算法的递归终止条件是只有一个圆盘需要移动时,直接将其从起始柱子A移动到目标柱子C即可。

2. 非递归算法
除了递归算法,我们还可以使用非递归算法来解决汉诺塔问题。

具体的算法流程如下:
(1) 将起始柱子A、辅助柱子B和目标柱子C分别压入堆栈。

(2) 当堆栈不为空时,执行以下循环:
a. 弹出栈顶元素,得到当前需要移动的圆盘数目n、起始柱子A、
辅助柱子B和目标柱子C;
b. 如果n==1,直接将起始柱子A上的一个圆盘移动到目标柱子C上;
c. 否则将n-1个圆盘从起始柱子A移动到辅助柱子B上,再将第n个圆盘从起始柱子A移动到目标柱子C上,最后将n-1个圆盘从辅助柱子B移动到目标柱子C上。

d. 将移动后的三个柱子B、A和C按照起始柱子A、辅助柱子B 和目标柱子C的顺序压入堆栈,重复(2)直到堆栈为空。

以上就是汉诺塔问题的两种解决思路,大家可以根据自己的需要和理解选择适合自己的算法来解决这个问题。

python 汉诺塔 非递归方法解题

python 汉诺塔 非递归方法解题

python 汉诺塔非递归方法解题---随着编程语言的发展,算法问题解决的方式也在不断变化。

汉诺塔问题就是一个经典的算法问题,通常采用递归的方法来解决。

但是,非递归的方法同样可以解决汉诺塔问题,下面就让我们来看看如何用Python实现非递归方法解决汉诺塔问题。

汉诺塔问题的基本概念是这样的:给定三个柱子A、B、C,每个柱子上都放了若干个按照一定顺序排列的盘子,每个盘子都由一个数字标记,表示盘子的位置和大小。

任务是将所有的盘子从一个柱子移动到另一个柱子,移动过程中需要遵守以下规则:1. 每个盘子只能移动到比它小的柱子上;2. 三个柱子上的盘子不能重叠;3. 移动过程中不能使用柱子C。

非递归方法解决汉诺塔问题通常采用回溯法。

这种方法的基本思路是尝试将问题分解为更小的子问题,通过回溯不同的子问题的解来找到最终的解。

在汉诺塔问题中,我们可以将任务分解为将最大的盘子从柱子A移到柱子B,然后将中间大小的盘子从柱子A移到柱子C,最后将最小的盘子从柱子C移到柱子B。

通过这种方式,我们可以逐步解决汉诺塔问题。

下面是用Python实现非递归方法解决汉诺塔问题的代码:```pythondef hanoi(n, source, target, auxiliary):if n > 0:# 将n-1个盘子从source柱子移动到auxiliary柱子,再将最大的盘子从source移动到targ et柱子hanoi(n-1, source, auxiliary, target)# 将最大的盘子从auxiliary移动到target柱子print(f'Move disk {n} from {source} to {target}')# 将n-1个盘子从auxiliary柱子移动到target柱子hanoi(n-1, auxiliary, target, source)```在这个函数中,参数n表示盘子的数量,source表示起始柱子,target表示目标柱子,auxiliary表示辅助柱子。

汉诺塔非递归算法C语言实现

汉诺塔非递归算法C语言实现

汉诺塔非递归算法C语言实现#include<>#include<>#define CSZL 10#define FPZL 10typedef struct hanoi{int n;char x,y,z;}hanoi;typedef struct Stack{hanoi *base,*top;int stacksize;}Stack;int InitStack(Stack *S){S->base=(hanoi *)malloc(CSZL*sizeof(hanoi));if(!S->base)return 0;S->top=S->base;S->stacksize=CSZL;return 1;}int PushStack(Stack *S,int n,char x,char y,char z){if(S->top-S->base==S->stacksize){S->base=(hanoi *)realloc(S->base,(S->stacksize+FPZL)*sizeof(hanoi));if(!S->base)return 0;S->top=S->base+S->stacksize;S->stacksize+=FPZL;}S->top->n=n;S->top->x=x;S->top->y=y;S->top->z=z;S->top++;return 1;}int PopStack(Stack *S,int *n,char *x,char *y,char *z){if(S->top==S->base)return 0;else{S->top--;*n=S->top->n;*x=S->top->x;*y=S->top->y;*z=S->top->z;return 1;}}int EmptyStack(Stack *S){if(S->base==S->top)return 1;elsereturn 0;}int i=1;void Move(char x,char z){printf("\n\n\t\t第%d部,从%c移到%c。

递归以及非递归方法解决汉诺塔问题

递归以及非递归方法解决汉诺塔问题

Pillar b = new Pillar(n,"B"); Pillar c = new Pillar(n,"C"); //把三个柱子按顺序排好,详见后面的算法那里的解释 Pillar[] pillars = new Pillar[3]; pillars[0] = a; if(n%2==0) { pillars[1] = b; pillars[2] = c; } else { pillars[1] = c; pillars[2] = b; } //开始移动,k 用来计数,移动次数为2^n-1,至于为什么,我不太清楚, //反正有人证明过。i 是用来保存最小那个盘子正在哪跟柱子上的。 int i=0; for(int k=0;k<(int)Math.pow(2, n)-1;) { int min; //将最小的盘子顺时针移动一个柱子 min = pillars[i%3].Pop(); pillars[(i+1)%3].Push(min); System.out.println(pillars[i%3]+"->"+pillars[(i+1)%3]); k++; i++; //这个 IF 好像可以不要,当时写的,后面忘了删除。 if(k<(int)Math.pow(2, n)-1) { //如果,剩下两根柱子中,某一根为空,则一定是非空那根中最上面个盘子 //移动到空的那个柱子上。若两根都不为空,则把编号小的一个盘子 //移动到另外跟柱子上 if(!pillars[(i-1)%3].isEmpty()&&(pillars[(i+1)%3].isEmpty()||pillars[ (i+1)%3].Top()>pillars[(i-1)%3].Top())) { min=pillars[(i-1)%3].Pop(); pillars[(i+1)%3].Push(min); System.ou#43;"->"+pillars[(i+1)%3]); } else { min=pillars[(i+1)%3].Pop(); pillars[(i-1)%3].Push(min); System.out.println(pillars[(i+1)%3]+"->"+pillars[(i-1)%3]); } k++;

汉诺塔非递归算法

汉诺塔非递归算法

汉诺塔
9
好 好 学 习

• •
• • •
• • •
汉诺塔
cout << ++k << ": " <<"Move disk " << ch << " from " << ta[i%3].name <<" to " << ta[(i+1)%3].name << endl; i++; //把另外两根柱子上可以移动的 圆盘移动到新的柱子上 if (k < max) { //把非空柱子上的圆盘移动到空 柱子上,当两根柱子都为空时,移 动较小的圆盘 if (ta[(i+1)%3].Top() == 0 ||ta[(i1)%3].Top() > 0 &&ta[(i+1)%3].Top() > ta[(i1)%3].Top()) { ch = ta[(i-1)%3].Pop(); ta[(i+1)%3].Push(ch);
8
汉诺塔
• • • • • • • • • • • • • • • • • •

long Pow(int x, int y) { long sum = 1; for (int i=0; i<y; i++) sum *= x; return sum; } void Hannuota(st ta[], long max) { int k = 0; //累计移动的次数 int i = 0; int ch; while (k < max) { //按顺时针方向把圆盘1从现在的柱子移动到下一根柱子 ch = ta[i%3].Pop(); ta[(i+1)%3].Push(ch);

汉诺塔不递归算法 python

汉诺塔不递归算法 python

汉诺塔(Tower of Hanoi)是一个经典的问题,它源自印度传说,相传在一个印度庙里,有一个圆座,圆座上套着三根铜柱,柱上套着64片黄金圆盘。

圆盘从大到小依序套在一根柱子上,而圆盘要从柱子上移至另一柱子上。

并且呢,规矩是穿小的不能套在大的上面,且每次只能移动一片。

有个传说是这样说的:世界末日来临前,大梵天要将这些圆盘从最左边的柱子移动到最右边的柱子上,如果在世界毁灭之前完成的话,世界就不毁灭了。

所以印度教徒一直想要研究这个问题,因为他们认为只要研究出汉诺塔的奥义,就能够通过移动圆盘,把世界毁灭的最终日期推迟。

但是即便是现代日常生活中,汉诺塔的问题也被广泛的用于算法科学的教学与理论研究之中。

那么究竟这个汉诺塔问题是怎样呢?究竟它的算法应该怎样编写呢?Python语言应该怎样实现它呢?下面就让我为你一一解答:一、汉诺塔问题背后的算法逻辑1. 汉诺塔问题的规则汉诺塔问题是经典的递归问题,它遵循以下规则:1)每次只能移动一个盘子;2)大盘子不能放在小盘子上面;3)只能在三根柱子之间移动盘子。

2. 汉诺塔问题的解法对于汉诺塔问题的解法,我们可以简单概括为以下三个步骤:A. 将n-1个盘子由A柱经过C柱移动到B柱;B. 将第n个盘子由A柱移动到C柱;C. 将n-1个盘子由B柱经过A柱移动到C柱。

二、非递归算法的实现在Python中,我们可以使用非递归算法来实现汉诺塔问题的解法。

下面给出一个示例代码:```pythondef hanoi(n, a, b, c):i = 1while n > 0:if n == 1:print("将第", n, "个盘子由", a, "移动到", c)else:print("将第", n, "个盘子由", a, "移动到", b)print("将第", n, "个盘子由", b, "移动到", c)print("将第", n, "个盘子由", c, "移动到", a)n -= 1```以上的代码中,我们使用了一个while循环来模拟递归的过程,实现了汉诺塔问题的非递归解法。

汉诺塔问题非递归算法

汉诺塔问题非递归算法

汉诺塔问题非递归算法
汉诺塔问题是一个经典的递归算法问题,但也可以使用非递归的方式解决。

下面是一种非递归算法的实现思路:
1. 创建三个栈,分别命名为A、B、C,表示三个柱子。

2. 对于n个盘子的汉诺塔问题,首先将所有盘子按从大到小的顺序依次压入栈A中。

3. 定义一个变量count,用来记录移动步数,初始值为0。

4. 如果n为奇数,则执行步骤5;如果n为偶数,则执行步骤6。

5. 循环执行以下操作:
5.1 将栈A的栈顶元素弹出,放入栈B中;
5.2 将栈A中剩余的n-1个盘子移到栈C中;
5.3 将栈B中的盘子移到栈C中;
5.4 将栈A作为辅助栈,栈B作为目标栈,栈C作为源栈,重复步骤5.1~5.3,直到栈A为空。

6. 循环执行以下操作:
6.1 将栈A的栈顶元素弹出,放入栈C中;
6.2 将栈A中剩余的n-1个盘子移到栈B中;
6.3 将栈C中的盘子移到栈B中;
6.4 将栈A作为辅助栈,栈C作为目标栈,栈B作为源栈,重复步骤6.1~6.3,直到栈A为空。

通过上述非递归算法,可以按照汉诺塔问题的规则将所有的盘子从栈A移动到栈B,并记录移动的步骤数。

C|用递归和非递归方法求解汉诺塔问题

C|用递归和非递归方法求解汉诺塔问题

C|用递归和非递归方法求解汉诺塔问题汉诺塔(Tower of Hanoi,又称河内塔)问题是源于印度一个古老传说的益智玩具。

大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。

大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。

并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

当盘子的个数为n时,移动的次数应等于2^n – 1。

后来一位美国学者发现一种出人意料的简单方法,只要轮流进行两步操作就可以了。

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

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

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

即把非空柱子上的圆盘移动到空柱子上,当两根柱子都非空时,移动较小的圆盘。

这一步没有明确规定移动哪个圆盘,你可能以为会有多种可能性,其实不然,可实施的行动是唯一的。

③ 反复进行①②操作,最后就能按规定完成汉诺塔的移动。

所以结果非常简单,就是按照移动规则向一个方向移动金片:如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C// 用递归求解汉诺塔问题int step=1; // 整型全局变量,预置1,步数void move(int, char, char, char);// 声明要用到的被调用函数void main(){int n;// 整型变量,n为盘数,printf("请输入盘数 n=");// 提示信息scanf("%d",&n);// 输入正整数nprintf("在3根柱子上移%d只盘的步骤为: ",n);move(n,'a','b','c');// 调用函数move(n,'a','b','c')system("pause");}void move(int m, char p, char q, char r){// 自定义函数体开始if (m==1)// 如果m为1,则为直接可解结点,{// 直接可解结点,输出移盘信息printf("[%d] move 1# from %c to %c ",step,p,r);step++;// 步数加1}else// 如果不为1,则要调用move(m-1){move(m-1,p,r,q);// 递归调用move(m-1)//直接可解结点,输出移盘信息printf("[%d] move %d# from %c to %c ", step, m, p, r);step++;// 步数加1move(m-1,q,p,r);// 递归调用move(m-1)}}//自定义函数体结束运行结果:请输入盘数 n=4在3根柱子上移4只盘的步骤为:[1] move 1# from a to b[2] move 2# from a to c[3] move 1# from b to c[4] move 3# from a to b[5] move 1# from c to a[6] move 2# from c to b[7] move 1# from a to b[8] move 4# from a to c[9] move 1# from b to c[10] move 2# from b to a[11] move 1# from c to a[12] move 3# from b to c[13] move 1# from a to b[14] move 2# from a to c[15] move 1# from b to c非递归方法:#include <iostream>using namespace std;//圆盘的个数最多为64const int MAX = 64;//用来表示每根柱子的信息struct st{int s[MAX]; //柱子上的圆盘存储情况int top; //栈顶,用来最上面的圆盘char name; //柱子的名字,可以是A,B,C中的一个int Top()//取栈顶元素{return s[top];}int Pop()//出栈{return s[top--];}void Push(int x)//入栈{s[++top] = x;}} ;long Pow(int x, int y); //计算x^yvoid Creat(st ta[], int n); //给结构数组设置初值void Hannuota(st ta[], long max); //移动汉诺塔的主要函数int main(void){int n;cout << "输入圆盘的个数:" << endl;cin >> n; //输入圆盘的个数st ta[3]; //三根柱子的信息用结构数组存储Creat(ta, n); //给结构数组设置初值long max = Pow(2, n) - 1;//动的次数应等于2^n - 1Hannuota(ta, max);//移动汉诺塔的主要函数system("pause");return 0;}void Creat(st ta[], int n){ta[0].name = 'A';ta[0].top = n-1;//把所有的圆盘按从大到小的顺序放在柱子A上for (int i=0; i<n; i++)ta[0].s[i] = n - i;//柱子B,C上开始没有没有圆盘ta[1].top = ta[2].top = 0;for (i=0; i<n; i++)ta[1].s[i] = ta[2].s[i] = 0;//若n为偶数,按顺时针方向依次摆放 AB Cif (n%2 == 0){ta[1].name = 'B';ta[2].name = 'C';}else //若n为奇数,按顺时针方向依次摆放 A C B{ta[1].name = 'C';ta[2].name = 'B';}}long Pow(int x, int y){long sum = 1;for (int i=0; i<y; i++)sum *= x;return sum;}void Hannuota(st ta[], long max){int k = 0; //累计移动的次数int i = 0;int ch;while (k < max){//按顺时针方向把圆盘1从现在的柱子移动到下一根柱子ch = ta[i%3].Pop();ta[(i+1)%3].Push(ch);cout << ++k << ": " <<"Move disk " << ch << " from " << ta[i%3].name <<" to " << ta[(i+1)%3].name << endl;i++;//把另外两根柱子上可以移动的圆盘移动到新的柱子上if (k < max){ //把非空柱子上的圆盘移动到空柱子上,当两根柱子都为空时,移动较小的圆盘if (ta[(i+1)%3].T op() == 0 ||ta[(i-1)%3].Top() > 0 &&ta[(i+1)%3].T op() > ta[(i-1)%3].Top()){ch = ta[(i-1)%3].Pop();ta[(i+1)%3].Push(ch);cout << ++k << ": " << "Move disk "<< ch << " from " << ta[(i-1)%3].name<< " to " << ta[(i+1)%3].name << endl;}else{ch = ta[(i+1)%3].Pop();ta[(i-1)%3].Push(ch);cout << ++k << ": " << "Move disk "<< ch << " from " << ta[(i+1)%3].name<< " to " << ta[(i-1)%3].name << endl;}}}}运行结果:输入圆盘的个数:5步骤:1: Move disk 1 from A to C 2: Move disk 2 from A to B 3: Move disk 1 from C to B 4: Move disk 3 from A to C 5: Move disk 1 from B to A 6: Move disk 2 from B to C 7: Move disk 1 from A to C 8: Move disk 4 from A to B 9: Move disk 1 from C to B 10: Move disk 2 from C to A 11: Move disk 1 from B to A 12: Move disk 3 from C to B 13: Move disk 1 from A to C 14: Move disk 2 from A to B 15: Move disk 1 from C to B 16: Move disk 5 from A to C 17: Move disk 1 from B to A 18: Move disk 2 from B to C 19: Move disk 1 from A to C 20: Move disk 3 from B to A 21: Move disk 1 from C to B 22: Move disk 2 from C to A23: Move disk 1 from B to A24: Move disk 4 from B to C25: Move disk 1 from A to C26: Move disk 2 from A to B27: Move disk 1 from C to B28: Move disk 3 from A to C29: Move disk 1 from B to A30: Move disk 2 from B to C31: Move disk 1 from A to C -End-。

汉诺塔非递归表达式

汉诺塔非递归表达式

汉诺塔非递归表达式一、汉诺塔的简单介绍汉诺塔这个东西可有意思啦。

它就像是一个很神奇的数学谜题。

有三根柱子,一堆大小不一样的圆盘,开始的时候圆盘都在一根柱子上,按照规定的规则把圆盘从起始柱子移动到目标柱子,而且小圆盘要一直在大圆盘上面。

这看起来简单,其实里面的门道可深啦。

二、非递归表达式的思路1. 汉诺塔的移动是有规律的。

我们要知道,它的总移动步数是2的n次方减1步,这里的n就是圆盘的个数。

比如说有3个圆盘,那就是2的3次方减1等于7步。

2. 它的非递归算法就像是按照一个固定的步骤来走。

我们可以把汉诺塔的移动看作是一个整体的任务分解。

如果有n个圆盘,我们先把最上面的n - 1个圆盘当作一个整体,先把它们移动到中间柱子,然后把最底下的那个大圆盘移动到目标柱子,最后再把中间柱子上的n - 1个圆盘移动到目标柱子。

3. 用数学的方式来表示这个过程。

假设我们用A表示起始柱子,B表示中间柱子,C表示目标柱子。

当n = 1的时候,直接把圆盘从A移动到C就好啦。

当n > 1的时候,我们先把n - 1个圆盘从A 借助C移动到B,这一步就像是一个子任务。

然后把A柱子上剩下的那个最大的圆盘移动到C。

最后再把B柱子上的n - 1个圆盘借助A移动到C。

三、具体的非递归表达式1. 我们可以用一个简单的算法来描述这个过程。

可以用循环来处理这个移动过程。

比如用一个计数变量i,从1到2的n次方减1。

在这个循环里面,我们根据i的值来确定是哪一步移动,是移动小圆盘还是大圆盘。

2. 把每一步的移动看作是一种状态的转换。

如果i的值是奇数,那么我们就把最上面的圆盘从当前柱子移动到按照顺序的下一个柱子(如果当前柱子是A,下一个柱子就是C;如果当前柱子是C,下一个柱子就是B;如果当前柱子是B,下一个柱子就是A)。

如果i 的值是偶数,那么我们就把可以移动的圆盘(不是最上面的圆盘,而是在符合规则下的圆盘)从当前柱子移动到另外一个柱子(这个柱子不是按照顺序的下一个柱子,而是另外一个)。

汉诺塔问题的递归解法和非递归解法(python语言实现)

汉诺塔问题的递归解法和非递归解法(python语言实现)

汉诺塔问题的递归解法和⾮递归解法(python语⾔实现)1. 汉诺塔问题的⾮递归解法(python语⾔类解法)#!/usr/bin/env python#coding:utf-8import sysimport timereload(sys)sys.setdefaultencoding('utf-8')class Mycolumns(object):val=0#__slots__ = ['plates','name']def __init__(self,name='',plates_num=0): = nameself.plates = []if plates_num > 0 :for i in range(0,plates_num):self.plates.append(n-i)@staticmethoddef fun():Mycolumns.val +=1print"this is the %d th time to move" %(Mycolumns.val)【这段可以⽤类⽅法代替】【@classmethoddef fun(cls):cls.val +=1print"this is the %d th time to move" %(cls.val)】def initialize(n):stack = []mycolumn1 = Mycolumns('A',n)if n%2 == 0:mycolumn2 = Mycolumns('B')mycolumn3 = Mycolumns('C')index = 2else:mycolumn2 = Mycolumns('C')mycolumn3 = Mycolumns('B')index = 1stack.append(mycolumn1)stack.append(mycolumn2)stack.append(mycolumn3)return stack,indexdef nowcolumn(i,stack):for item in stack:if i in item.plates:return itemdef nextcolumn(i,stack):for item in stack:if i in item.plates:if i%2!=0:next = (stack.index(item)+1)%3else:next = (stack.index(item)+2)%3#print "%d next column is %s"%(i,stack[next].name)return stack[next]def move(nowcolumn,nextcolumn):n = nowcolumn.plates.pop()nextcolumn.plates.append(n)print "move plate %d from %s to %s" %(n,,)Mycolumns.fun()def hannuoyi(n):stack,index = initialize(n)#max = pow(2,n)-1#k =0#while(k<max): FINAL = [] for i in range(0,n): FINAL.append(n-i) while(stack[index].plates!=FINAL):for i in range(1,n+1):#print "i value is %d" %(i)if(nowcolumn(i,stack).plates.index(i)==len(nowcolumn(i,stack).plates)-1 and (nextcolumn(i,stack).plates==[] or i< nextcolumn(i,stack).plates[-1])): move(nowcolumn(i,stack),nextcolumn(i,stack))#k = k+1else:pass#print"can not move plate %d" %(i)print stack[0].plates,stack[0].nameprint stack[1].plates,stack[1].nameprint stack[2].plates,stack[2].nameif __name__=="__main__":n=3hannuoyi(n) 2. 汉诺塔问题的⾮递归解法(python语⾔过程式解法)#!/usr/bin/env python#coding:utf-8import sysimport timereload(sys)sys.setdefaultencoding('utf-8')global aa =0def fun():global aa = a+1print"this is the %d th time to move" %(a)def nowcolumn(i,stackA,stackB,stackC):if i in stackA:return stackAelif i in stackB:return stackBelse:return stackCdef nextcolumn(n,i,stackA,stackB,stackC):if n%2==0:if i in stackA:if i%2!=0:newcolumn = stackBelse:newcolumn = stackCif i in stackB:if i%2!=0:newcolumn = stackCelse:newcolumn = stackAif i in stackC:if i%2!=0:newcolumn = stackAelse:newcolumn = stackBelse:if i in stackA:if i%2==0:newcolumn = stackBelse:newcolumn = stackCif i in stackB:if i%2==0:newcolumn = stackCelse:newcolumn = stackAif i in stackC:if i%2==0:newcolumn = stackAelse:newcolumn = stackBreturn newcolumndef move(nowcolumn,nextcolumn):n = nowcolumn.pop()nextcolumn.append(n)print "move plate %d" %(n)fun()def hannuoyi(n):stackA = []stackB = []stackC = []FINAL = []for i in range(0,n):stackA.append(n-i)FINAL.append(n-i)print stackA,stackB,stackC,FINALwhile(stackC!=FINAL):for i in range(1,n+1):print "i value is %d" %(i)if(nowcolumn(i,stackA,stackB,stackC).index(i)==len(nowcolumn(i,stackA,stackB,stackC))-1 and (nextcolumn(n,i,stackA,stackB,stackC)==[] or i< nextcolumn(n,i,stackA,stackB,stackC)[-1])):move(nowcolumn(i,stackA,stackB,stackC),nextcolumn(n,i,stackA,stackB,stackC))else:print"can not move plate %d" %(i)print stackA,stackB,stackCif __name__=="__main__":n=6hannuoyi(n)2. 汉诺塔问题的递归解法(python语⾔)#!/usr/bin/env python#coding:utf-8import sysreload(sys)sys.setdefaultencoding('utf-8')global aa =0def fun():global aa = a+1def hannuoyi(n,A,B,C):if n==1:move(1,A,C)else:hannuoyi(n-1,A,C,B)move(n,A,C)hannuoyi(n-1,B,A,C)def move(n,tempA,tempB):print "move plate %d from column %s to column %s" %(n,tempA,tempB)fun()if __name__=="__main__":hannuoyi(3,'A','B','C')print "total:we need %d steps"%(a)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
} ;
long Pow(int x, int y); //计算x^y
void Creat(st ta[], int n); //给结构数组设置初值
void Hannuota(st ta[], long max); //移动汉诺塔的主要函数
int main(void)
{
for (int i=0; i<y; i++)
sum *= x;
return sum;
}
void Hannuota(st ta[], long max)
{
int k = 0; //累计移动的次数
int i = 0;
{
return s[top];
}
int Pop()//出栈
{
return s[top--];
}
void Push(int x)//入栈
{
s[++top] = x;
}
else
{
ch = ta[(i+1)%3].Pop();
ta[(i-1)%3].Push(ch);
for (int i=0; i<n; i++) //把所有的圆盘按从大到小的顺序放在柱子A上
ta[0].s[i] = n - i;
ta[1].top = ta[2].top = 0;//柱子B,C上开始没有没有圆盘
for (int i=0; i<n; i++)
int n;
cin >> n; //输入圆盘的个数
st ta[3]; //三根柱子的信息用结构数组存储
Creat(ta, n); //给结构数组设置初值
long max = Pow(2, n) - 1;//动的次3;;
//把另外两根柱子上可以移动的圆盘移动到新的柱子上
if (k < max)
{ //把非空柱子上的圆盘移动到空柱子上,当两根柱子都为空时,移动较小的圆盘
if (ta[(i+1)%3].Top() == 0 || ta[(i-1)%3].Top() > 0 && ta[(i+1)%3].Top() > ta[(i-1)%3].Top())
{
ch = ta[(i-1)%3].Pop();
ta[(i+1)%3].Push(ch);
cout << ++k << ": " << "Move disk " << ch << " from " << ta[(i-1)%3].name << " to " << ta[(i+1)%3].name << endl;
cout << ++k << ": " << "Move disk " << ch << " from " << ta[(i+1)%3].name << " to " << ta[(i-1)%3].name << endl;
}
算法介绍:
首先容易证明,当盘子的个数为n时,移动的次数应等于2^n - 1。
一位美国学者发现一种出人意料的方法,只要轮流进行两步操作就可以了。
首先把三根柱子按顺序排成品字型,把所有的圆盘按从大到小的顺序放在柱子A上。
根据圆盘的数量确定柱子的排放顺序:若n为偶数,按顺时针方向依次摆放 A B C;
若n为奇数,按顺时针方向依次摆放 A C B。
(1)按顺时针方向把圆盘1从现在的柱子移动到下一根柱子,即当n为偶数时,若圆盘1在柱子A,则把它移动到B;
若圆盘1在柱子B,则把它移动到C;若圆盘1在柱子C,则把它移动到A。
(2)接着,把另外两根柱子上可以移动的圆盘移动到新的柱子上。
即把非空柱子上的圆盘移动到空柱子上,当两根柱子都非空时,移动较小的圆盘
这一步没有明确规定移动哪个圆盘,你可能以为会有多种可能性,其实不然,可实施的行动是唯一的。
(3)反复进行(1)(2)操作,最后就能按规定完成汉诺塔的移动。
*/
复制代码#include <iostream>
using namespace std;
const int MAX = 64; //圆盘的个数最多为64
Hannuota(ta, max);//移动汉诺塔的主要函数
system("pause");
return 0;
}
void Creat(st ta[], int n)
{
ta[0].name = 'A';
ta[0].top = n-1;
ta[1].s[i] = ta[2].s[i] = 0;
if (n%2 == 0) //若n为偶数,按顺时针方向依次摆放 A B C
{
ta[1].name = 'B';
ta[2].name = 'C';
}
else //若n为奇数,按顺时针方向依次摆放 A C B
{
ta[1].name = 'C';
ta[2].name = 'B';
}
}
long Pow(int x, int y)
{
long sum = 1;
}
}
}
struct st{ //用来表示每根柱子的信息
int s[MAX]; //柱子上的圆盘存储情况
int top; //栈顶,用来最上面的圆盘
char name; //柱子的名字,可以是A,B,C中的一个
int Top()//取栈顶元素
int ch;
while (k < max)
{
//按顺时针方向把圆盘1从现在的柱子移动到下一根柱子
ch = ta[i%3].Pop();
ta[(i+1)%3].Push(ch);
cout << ++k << ": " << "Move disk " << ch << " from " << ta[i%3].name << " to " << ta[(i+1)%3].name << endl;
相关文档
最新文档