汉诺塔

汉诺塔问题笔记(Java实现)

蹲街弑〆低调 提交于 2019-12-28 12:04:25
汉诺塔问题笔记(Java实现) 前言 这两天在B站跟着小甲鱼学习递归的时候遇到了汉诺塔问题,乍一听没想明白,动手画了画才明白过来,因为本人递归学的不太好,为了加深印象,也为了验证自己是否真的明白了,决定写一个笔记记录一下。 B站小甲鱼传送门: 小甲鱼讲解数据结构和算法 p34 汉诺塔问题 问题描述 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。(来自百度百科) 现在抛开问题的背景,汉诺塔问题可以简单描述如下: 初始状态:有三根柱子,其中第一根柱子上堆放着任意数量(n)的圆盘,另外两根是空柱子。 圆盘在任意柱子上的摆放遵循以下原则:在上方的圆盘半径不能超过其下方的圆盘半径。(这里为了简化问题,可以给所有的圆盘编号,最大的圆盘编号最大 n,最小的圆盘编号最小 1,那么也就是说在任意一根柱子上,圆盘的编号必须从下往上依次减小) 目标:将所有的圆盘从一开始的柱子移动到第三根柱子上,在移动过程中和结束状态下圆盘的摆放都必须遵循 2 中的原则。 要求:列出完成目标所需要的所有步骤。 解析 汉诺塔问题是递归中的经典问题,这里也只介绍一下递归的解法。(以下的 n

python递归:汉诺塔问题最简洁的算法

[亡魂溺海] 提交于 2019-12-26 09:51:40
使用python的递归做一个简洁的解法: def hanoi ( src , des , mid , n ) : global steps if n == 1 : steps += 1 print ( "[STEP{:>4}] {}->{}" . format ( steps , src , des ) ) else : hanoi ( src , mid , des , n - 1 ) steps += 1 print ( "[STEP{:>4}] {}->{}" . format ( steps , src , des ) ) hanoi ( mid , des , src , n - 1 ) if __name__ == "__main__" : steps = 0 N = eval ( input ( ) ) hanoi ( "A" , "C" , "B" , N ) 效果如图: 来源: CSDN 作者: Memory逆光 链接: https://blog.csdn.net/weixin_44936889/article/details/103706728

汉诺塔问题

半城伤御伤魂 提交于 2019-12-25 02:14:23
汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作? 分析 如果是初次接触类似的问题,乍看之下肯定会感觉无从下手。 要把64个圆盘从a柱子移动到c柱子上,第一步应该怎么做?虽然可以肯定,第一步唯一的选择是移动a最上面的那个圆盘,但是应该将其移到b还是c呢?很难确定。因为接下来的第二步、第三步……直到最后一步,看起来都是很难确定的。能立即确定的是最后一步:最后一步的盘子肯定也是a最上面那个圆盘,并且是由a或b移动到c——此前已经将63个圆盘移动到了c上。 也许你会说,管他呢,先随便试着移动一下好了。如果你这么做,你会发现,接下来你会面临越来越多类似的选择,对每一个选择都“试”一下的话,你会偏离正确的道路越来越远,直到你发现你接下来无法进行为止。 如果将这个问题的盘子数量减为10个或更少,就不会有太大的问题了。但盘子数量为64的话,你一共需要移动约1800亿亿步(18,446,744,073,709,551,615),才能最终完成整个过程。这是一个天文数字

递归解决汉诺塔问题

醉酒当歌 提交于 2019-12-25 02:13:29
题目来自百度百科: 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。 大梵天 创造世界的时候做了三根 金刚石 柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 c语言实现(假设最开始放64片黄金圆盘的柱子为A, 要移动到C柱子上,借助的介质为B柱子): 1 #include <stdio.h> 2 /* 3 * 伪算法(要移动盘子的柱子为A,借助的介质柱子为B,移动到目的柱子为C. 4 * 如果盘子数为1,则直接将盘子从A柱子移到C柱子。 5 * 否则: 6 * step1:将A柱子上的N-1个盘子借助于C柱子移动到B柱子上。 7 * step2:将A柱子上的第N个盘子直接移动到C柱子上。 8 * step3:将B柱子上的N-1个盘子借助A柱子移动到C柱子上。 9 */ 10 11 void hanoi( int n, char A, char B, char C) { 12 if ( 1 == n) { 13 printf( " 将编号为%d的盘子从%c柱子直接移动到%c柱子\n " , n, A, C); 14 } else { 15 hanoi(n - 1 , A, C, B); 16 printf( " 将编号为

汉诺塔(河内塔)算法 ----C语言递归实现

一曲冷凌霜 提交于 2019-12-25 02:13:14
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根 金刚石 柱子, 在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。 并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 汉诺塔的递归实现算法,将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次 操作系统:ubuntu 编译软件:gcc 结果截图: 我选择了64个,运行了2分钟还不到第10个。。。。。。。。。。。。。。。。。 5 个的话,不到一眨眼的时间 1 #include <stdio.h> 2 3 4 //将n个圆盘从x柱子上借助y柱子移动到z柱子上 5 void move(int n, char x, char y, char z) 6 { 7 if(n == 1) 8 printf("圆盘编号 %d :从 %c 移动到

python下实现汉诺塔

拟墨画扇 提交于 2019-12-25 02:12:28
汉诺塔是印度一个古老传说的益智玩具。汉诺塔的移动也可以看做是递归函数。 我们对柱子编号为a, b, c,将所有圆盘从a移到c可以描述为: 如果a只有一个圆盘,可以直接移动到c; 如果a有N个圆盘,可以看成a有1个圆盘(底盘) + (N-1)个圆盘,首先需要把 (N-1) 个圆盘移动到 b,然后,将 a的最后一个圆盘移动到c,再将b的(N-1)个圆盘移动到c。 请编写一个函数,给定输入 n, a, b, c,打印出移动的步骤: move(n, a, b, c) 例如,输入 move(2, ‘A’, ‘B’, ‘C’),打印出: A –> B A –> C B –> C 背景资料: 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 代码实现方式如下: def move(n, a, b, c): if n==1: print a,'-->',c return else: move(n-1,a,c,b) #首先需要把 (N-1) 个圆盘移动到 b move(1,a,b,c) #将a的最后一个圆盘移动到c move(n-1,b,a,c) #再将b的

习题3.10 汉诺塔的非递归实现 (25分)

主宰稳场 提交于 2019-12-22 05:48:49
借助堆栈以非递归(循环)方式求解汉诺塔的问题(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 理解一下首先我写了下递归的情况,这里讲下思路: 其实最终移盘子可以看做是: 1.将0到n-1个盘子借助c从a移到b; 2.将第n个盘子借助b从a移动到c; 3.最后把0到n-1个盘子借助a移动到c; #include <stdio.h> #include <stdlib.h> void move(char A, char C) { printf("%c -> %c\n",A,C); } void hanoi(int n, char A, char B, char C); int main() { int n; scanf("%d",&n); char A = 'a', B = 'b', C = 'c'; hanoi(n,A,B,C); return 0; } void hanoi( int n, char A, char B, char C

汉诺塔的图解递归算法

折月煮酒 提交于 2019-12-21 20:54:10
原文链接:(转载请注明出处) https://dmego.me/2016/10/16/hanoi 一.起源:   汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 二.抽象为数学问题:   如下图所示,从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘子上面,求移动的步骤和移动的次数 解:(1)n == 1       第1次 1号盘 A---->C sum = 1 次 (2) n == 2       第1次 1号盘 A---->B        第2次 2号盘 A---->C       第3次 1号盘 B---->C sum = 3 次   (3)n == 3         第1次 1号盘 A---->C         第2次 2号盘 A---->B         第3次 1号盘 C---->B         第4次 3号盘 A---->C         第5次 1号盘 B---->A         第6次 2号盘 B-

递归法解汉诺塔问题

橙三吉。 提交于 2019-12-20 02:22:31
汉诺塔简介   法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔(Tower of Hanoi)。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。   我们假设金片的数量为n,移动的次数为f(n),不难发现f(k+1)=2f(k)+1,也不难证明出f(n)=2 n -1。也就是说,移动64片金片至少需要(2 64 -1)次,也就是18,446,744,073,709,551,615‬次。假设每秒钟移动一个圆盘,不考虑闰年,移动这些金片也需要584,942,417,355年。要知道,地球的年龄是45.5亿年…… 递归法解汉诺塔问题   以上所说的属于数学范畴,在此不再赘述。我们要讲的重点是用代码来解决汉诺塔问题。这里我采用了递归的思想。递归并不一定是最好的方法,但就我而言,递归是最容易想到也是最容易理解的方法。   我们设汉诺塔的三根柱子从左到右分别为A,B,C,在A柱上有n个圆盘( PS:还是叫圆盘好听些,叫金片总是感觉有些不习惯…… )

Bailian4147 汉诺塔问题(Hanoi)

安稳与你 提交于 2019-12-18 13:51:53
4147:汉诺塔问题(Hanoi) 总时间限制: 1000ms 内存限制: 65535kB 描述 一、汉诺塔问题 有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆: 每次只能移动一个圆盘; 大盘不能叠在小盘上面。 提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则。 问:如何移?最少要移动多少次? 汉诺塔示意图如下: 三个盘的移动: 二、故事由来 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。 不管这个传说的可信度有多大,如果考虑一下把64片金片,由一根针上移到另一根针上,并且始终保持上小下大的顺序。这需要多少次移动呢?这里需要递归的方法。假设有n片,移动次数是f(n).显然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此后不难证明f(n)=2