汉诺塔

【算法题】用栈来解决汉诺塔问题

[亡魂溺海] 提交于 2020-03-06 23:56:48
用栈来解决汉诺塔问题 题目 修改汉诺塔问题的游戏规则:限制不能从最左侧的塔直接移动到最右侧,也不能从最右侧直接移动到最左侧,而是必须经过中间。求当塔有N层的时候,打印最优移动和最优移动总步数。 要求: 方法一:递归的方法 方法二:非递归的方法,用栈来模拟汉诺塔的三个塔 思路 方法一:递归的方法 首先,如果只剩最上层的塔需要移动,则有如下处理: 如果希望从左移动到右,打印Move 1 from left to right 如果希望从中移动到左,打印Move 1 from mid to left 如果希望从中移动到右,打印Move 1 from mid to right 如果希望从右移动到中,打印Move 1 from right to mid 如果希望从左移动到右,打印Move 1 from left to mid Move 1 from mid to right 如果希望从右移动到左,打印Move 1 from right to mid Move 1 from mid to left 以上就是递归的终止条件,也就是只剩上层塔时的打印过程。 多层塔的时候。 如果剩下N层塔,从最上到最小依次为1~N-1,则有如下判断 如果剩下的N层塔都在左,希望全部移到中,则有三个步骤 1)将1~N-1层塔先全部从左移动到右,交给递归过程 2)将第N层塔从左移到中 3)将1~N-1层塔全部从右移到中

汉诺塔问题python解决

徘徊边缘 提交于 2020-03-05 15:06:54
汉诺塔(益智玩具):汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 递归函数: 函数+分支结构组成 包含递归链条+递归基例 汉诺塔的python程序 step = 0 def fanta(n, a, b, c): # n用于接收是几层的,abc表示三根柱子,圆盘序号从上到下累加 global step if n == 1: print("对{}号圆盘的操作:{} --> {}".format(1, a, c)) step += 1 else: fanta(n-1, a, c, b) print("对{}号圆盘的操作:{} --> {}".format(n, a, c)) step += 1 fanta(n-1, b, a, c) x = int(input("请输入圆盘个数: ")) fanta(x, "A", "B", "C") print("完成操作共计{}步".format(step)) 程序执行效果 来源: CSDN 作者: BlackL_Y 链接: https://blog.csdn.net/weixin_44061641

汉诺塔-Hanoi

筅森魡賤 提交于 2020-03-02 06:18:40
1. 问题来源: 汉诺塔(河内塔)问题是印度的一个古老的传说。   法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。   后来,这个传说就演变为汉诺塔游戏,玩法如下:   (1). 有三根杆子A,B,C。A杆上有若干碟子   (2). 每次移动一块碟子,小的只能叠在大的上面   (3). 把所有碟子从A杆全部移到C杆上 2. 解题思路:   题中只给了三座塔,我们利用B塔将圆盘全部移动到在C塔。    为了将 N 个盘子从 A 移动到 C, 需要先将第 N 个盘子上面的 N-1 个盘子移动到 B 上,这样才能将第 N 个盘子移动到 C 上。   同理,为了将第 N-1 个盘子从 B 移动到 C 上,需要将 N-2 个盘子移动到 A 上,这样才能将第 N-1 个盘子移动到 C 上。   通过递归就可以实现汉诺塔问题的求解。 3. 源代码: 1 public class

汉诺塔

混江龙づ霸主 提交于 2020-03-01 08:42:09
#!/usr/bin/env python3 def hannuota(n, a, b, c): if n == 1: print(a, '-->', c) # elif n == 2: # print(a, '-->', b) # print(a, '-->', c) # hannuota(1, b, a, c) else: hannuota(n - 1, a, c, b) #以C盘为中介,从A杆将1至n-1号盘移至B杆; print(a, '-->', c) #将A杆中剩下的第n号盘移至C杆; hannuota(n - 1, b, a, c) #以A杆为中介;从B杆将1至n-1号盘移至C杆 hannuota(5, 'A', 'B', 'C') 把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。 来源: CSDN 作者: qq_41572664 链接: https://blog.csdn.net/qq_41572664/article/details/104573709

汉诺塔的递归实现

梦想与她 提交于 2020-03-01 03:30:16
求解汉诺塔的问题(n, a, b, c),即将N个盘子从起始柱(标记为“a”)通过借助柱(标记为“b”)移动到目标柱(标记为“c”),并保证每个移动符合汉诺塔问题的要求。 输入格式: 输入为一个正整数N,即起始柱上的盘数。 输出格式: 每个操作(移动)占一行,按柱1 -> 柱2的格式输出。 输入样例: 3 输出样例: a -> c a -> b c -> b a -> c b -> a b -> c a -> c #include<cstdio> #include<cstdlib> #include<cstring> void ta(int n,char A,char B,char C); int main() { int n; scanf("%d",&n); ta(n,'a','b','c'); return 0; } void ta(int n,char A,char B,char C) { if(n==1) printf("%c -> %c\n",A,C); else { ta(n-1,A,C,B); printf("%c -> %c\n",A,C); ta(n-1,B,A,C); } } 你说递归不香吗?何必为难自己。 来源: CSDN 作者: qq_34928355 链接: https://blog.csdn.net/qq_34928355/article/details

python汉诺塔

﹥>﹥吖頭↗ 提交于 2020-02-28 08:40:49
有三个立柱A、B、C。A柱上穿有大小不等的圆盘N个,较大的圆盘在下,较小的圆盘在上。要求把A柱上的圆盘全部移到C柱上,保持大盘在下、小盘在上的规律(可借助B柱)。每次移动只能把一个柱子最上面的圆盘移到另一个柱子的最上面。请输出移动过程。 解答 这是动态规划问题中的一种,用递归来实现较为简单方便。 对于“将moveSum个圆盘从from柱移动到to柱(借助by柱)”这个问题,我们可以通过以下三步实现: 将from柱最上面的moveSum-1个圆盘移动到by柱(借助to柱) 将from柱上剩下的那1个圆盘直接移动到to柱 将by柱上的moveSum-1个圆盘移动到to柱(借助from柱) 执行的流程如下: 来源: 51CTO 作者: freeterman 链接: https://blog.51cto.com/myunix/2399892

汉诺塔解法解析

时间秒杀一切 提交于 2020-02-28 02:20:14
汉诺塔: 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 简单描述:将 A 上 N 个盘子经过 B 移动到 C。 首先考虑最简单的情况,A 柱上只有一个圆盘,这时候只需要将该圆盘从 A --> C 即可。 然后考虑 A 柱上有两个圆盘, 这时候需要将第一个圆盘 A --> B ,然后将第二个圆盘 A --> C ,最后 B --> C,就完成了移动。 关键一步,谨记递归的思想是不考虑细节。 现在有 N 个圆盘,我们需要将其分为两部分,第 N 个圆盘和第 N-1 以上的圆盘,比如现在 N=4,那么就将圆盘分为 [4, (3,2,1)] 两部分,按照第二步中的想法,我们的思想是 (3,2,1) 移动到 B,然后将 4 移动到 C,最后将(3,2,1) 移动到 C 完成。 现在的问题是 (3,2,1) 并不是一个圆盘,我们要将 (3,2,1) 移动到 B,就可以将此抽象为另一个汉诺塔问题,将 A 上 N-1 个盘子经过 C 移动到 B。 解法: 所有的递归问题都由两部分组成: 基础情况 和 递归情况 基础情况简单来说就是该递归函数的终点

python学习笔记三

倾然丶 夕夏残阳落幕 提交于 2020-02-26 20:14:47
  函数:   __doc__:显示函数文档:也可使用help()      函数中无法直接修改全局变量,需要对变量定义为global:      global适用于函数内部修改全局变量的值   nonlocal适用于嵌套函数中内部函数修改外部变量的值      使用MyFunction1 时返回的是MyFunction1 这个函数;   使用MyFunction1() 时返回的是MyFunction1 () 执行后的返回值,如果MyFunction1 ()函数没有返回值则返回值为None,      lambda匿名函数:使用过后被清除,没有名字       fileter()函数: 用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换。   最终得出结果为true的新列表:       递归算法:    递归算法求阶乘: 1 ###递归函数求阶乘 2 def jiecheng(number): 3 if(number == 1): 4 return 1 5 else: 6 return number*jiecheng(number-1) 7 number = int(input('请输入一个正整数:')) 8 print(number,'的阶乘为:',jiecheng(number)) 递归求阶乘   结果:      

python递归——汉诺塔

…衆ロ難τιáo~ 提交于 2020-02-26 05:28:58
汉诺塔的传说 法国数学家 爱德华·卢卡斯 曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神 梵天 在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而 梵塔 、庙宇和众生也都将同归于尽。   不管这个传说的可信度有多大,如果考虑一下把64片金片,由一根针上移到另一根针上,并且 始终保持上小下大的顺序 。   这需要多少次移动呢?这里需要递归的方法。假设有n片,移动次数是f(n).显然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此后不难证明 f(n)=2^n-1 。n=64时, 假如每秒钟一次,共需多长时间呢?一个平年365天有31536000 秒,闰年366天有31622400秒,平均每年31556952秒,计算一下:   18446744073709551615秒   这表明移完这些金片需要 5845.54亿年 以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。真的过了5845.54亿年,不说太阳系和银河系,至少地球上的一切生命

递归-汉诺塔

雨燕双飞 提交于 2020-02-26 02:19:11
两个汉诺塔,一个是普通版的,另一个是加上必须经过中间柱子的。 # include <stdio.h> # include <iostream> # include <math.h> using namespace std ; int ans = 0 , n ; long long ans2 = 0 ; void hmove ( char a , char b , char c , int n ) { if ( n == 0 ) { return ; } hmove ( a , c , b , n - 1 ) ; //前n - 1块从a移动到b上 printf ( "%c -> %c\n" , a , c ) ; //我自己移动一块从a -> c ans ++ ; //我移动了几次? hmove ( b , a , c , n - 1 ) ; //最后把 n - 1块从b移动到c上 } //只能先移动到相邻的柱子上 void hmove2 ( char a , char b , char c , int n ) { if ( n == 0 ) { return ; } hmove2 ( a , b , c , n - 1 ) ; //把前n - 1块通过b移动到c上 ans2 ++ ; //把最后一块移动到b上 printf ( "%c -> %c\n" , a , b ) ;