汉诺塔

C#实现汉诺塔问题

孤者浪人 提交于 2020-01-13 08:07:32
汉诺塔的由来: 汉诺塔是源自印度神话里的玩具。 上帝创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上安大小顺序摞着64片黄金圆盘。 上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 有预言说,这件事完成时宇宙会在一瞬间闪电式毁灭。也有人相信婆罗门至今还在一刻不停地搬动着圆盘。 汉诺塔与宇宙寿命: 如果移动一个圆盘需要1秒钟的话,等到64个圆盘全部重新落在一起,宇宙被毁灭是什么时候呢? 让我们来考虑一下64个圆盘重新摞好需要移动多少次吧。1个的时候当然是1次,2个的时候是3次,3个的时候就用了7次......这实在是太累了 1个圆盘的时候 2的1次方减1 2个圆盘的时候 2的2次方减1 3个圆盘的时候 2的3次方减1 4个圆盘的时候 2的4次方减1 5个圆盘的时候 2的5次方减1 ........ n个圆盘的时候 2的n次方减1 也就是说,n=64的时候是(2的64次方减1)次。 因此,如果移动一个圆盘需要1秒的话, 宇宙的寿命=2的64次方减1(秒) 用一年=60秒x60分x24小时x365天来算的话,大约有5800亿年吧。 据说,现在的宇宙年龄大约是150亿年,还差得远呢。 汉诺塔问题在数学界有很高的研究价值, 而且至今还在被一些数学家们所研究, 也是我们所喜欢玩的一种益智游戏,

HDU 1207 汉诺塔II

耗尽温柔 提交于 2020-01-13 08:06:44
汉诺塔II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3747 Accepted Submission(s): 1862 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在。可能有人并不知道汉诺塔问题的典故。汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往上按大小顺序摞着64片黄金圆盘。上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一回只能移动一个圆盘。有预言说,这件事完成时宇宙会在一瞬间闪电式毁灭。也有人相信婆罗门至今仍在一刻不停地搬动着圆盘。恩,当然这个传说并不可信,如今汉诺塔更多的是作为一个玩具存在。Gardon就收到了一个汉诺塔玩具作为生日礼物。   Gardon是个怕麻烦的人(恩,就是爱偷懒的人),很显然将64个圆盘逐一搬动直到所有的盘子都到达第三个柱子上很困难,所以Gardon决定作个小弊,他又找来了一根一模一样的柱子,通过这个柱子来更快的把所有的盘子移到第三个柱子上。下面的问题就是:当Gardon在一次游戏中使用了N个盘子时,他需要多少次移动才能把他们都移到第三个柱子上

递归调用——汉诺塔问题

穿精又带淫゛_ 提交于 2020-01-11 15:54:59
递归问题一直是我没弄懂的问题,就是不明白递归在调用函数的时候实现过程是怎么一回事,递归函数在调用的过程中代码的执行顺序是怎样的,看到有博主做了一个很形象的解释:说从前有座山,山里有座庙,庙里有个老和尚,老和尚在讲故事,故事是说从前有座山,山里有座庙,庙里有个老和尚,老和尚在讲故事,故事是说从前有座山,山里有座庙,庙里有个老和尚,老和尚在讲故事。。。。。。对,就是这种反复循环我不懂; 现就汉诺塔问题根据输出样例来大致了解一下这个题里递归函数是怎么执行的; 输入输出样例 首先得了解汉诺塔问题的三个核心步骤: 1.将初始位置A上面的n-1个盘子借助目标位置C移动到中间位置B暂时存放; 2.将初始位置A最下面的大盘子直接移动到目标位置C; 3.将中间位置B存放的n-1个盘子借助初始位置A移动到目标位置C。 代码实现 本题重点分析代码实现过程中递归调用的执行顺序和过程 以n=3为例(途中所标红色序号为输出顺序) 来源: CSDN 作者: 十三@ 链接: https://blog.csdn.net/qq_45302622/article/details/103933643

Python之汉诺塔问题及python安全

一曲冷凌霜 提交于 2020-01-07 12:08:32
Python之汉诺塔问题 今天学习了一下汉诺塔问题,像了许久啊!!脑袋不太OK!记得上次看到汉诺塔是我在看电影的时候,电影场景里给大猩猩测试智商的。。。。 这里使用的是Python3编写的代码,毕竟大家都知道2020年的1月1日Python2已经正式退休了。下面是Python3的时代了。 发现规律后就会意识到这个就是一个递归函数,挺明显的。 代码如下: ''' 下面是汉诺塔问题不同的圆盘个数实现任务的次数规律: n=1 a=1 f(x) = 1 n=2 a=3 f(2) = 2*f(1)+1 n=3 a=7 f(3) = 2*f(2)+1 n=4 a=15 f(4) = 2*f(3)+1 ... ... f(n) = 2*f(n-1)+1 ''' def Move ( n , a , b , c ) : if n == 1 : print ( a , '--->' , c ) #如果只有一个圆盘就直接把它从A拿到C,并且结束程序。 return 0 else : #不是一个圆盘那么就要对n-1个圆盘从A移到B Move ( n - 1 , a , c , b ) print ( a , '--->' , c ) #把最底下的那个从A移动到C Move ( n - 1 , b , a , c ) #最后把在B的n-1个圆盘移动到C number = input ( '请输入圆盘的个数

汉诺塔问题

一世执手 提交于 2020-01-06 13:41:08
汉诺塔hanoi问题 问题描述 假设有三个柱子A.B.C,N个盘子 每次只允许移动一个盘子 必须保证小盘子在大盘子之上 如何把所有盘子从A移到C? 理解过程(转化为递归问题) 用C柱做过渡,将A柱上的n-1的盘子移到B上 从A柱上最下面的盘子直接移到C柱上 用A柱做过渡,将B柱上的n-1个盘子移到C上 算法实现 #include "iostream" ​ using namespace std; ​ void move(int x,char a,char b) { cout<<x<<"从"<<a<<"移到"<<b<<"\n"; } ​ void hanoi(int n,char x,char y,char z) { if(n==1) move(n,x,z); else { hanoi(n-1,x,z,y); move(n,x,z); hanoi(n-1,y,x,z); } } ​ int main(void) { int n; cin>>n; hanoi(n,'A','B','C'); ​ return 0; } 来源: https://www.cnblogs.com/Mr-Peng/p/12155329.html

汉诺塔

喜夏-厌秋 提交于 2019-12-30 03:46:38
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 递归法 /*程序名 汉诺塔 递归方法实现 有三个木桩 p1,p2,p3 ,把在p1上的n个盘子移动到p3上,一次只能移动一个盘子, 并且此过程中每个木桩上的盘子都是按小到大排列。 */ #include <stdio.h> void hanoi(int n, int from, int to, int tmp); int main() { int n = 3;//盘子数量 int p1 = 1; int p2 = 2; int p3 = 3;//p1 p2 p3 模拟三个木桩 hanoi(n, p1, p3, p2); } void hanoi(int n,int from ,int to ,int tmp) { if (n == 1) { printf("%d:%d->%d\n", n, from, to); return; } //先从p1挪动n-1个盘子到p2 hanoi(n - 1, from, tmp, to); //再挪动第n个盘子从p1到p3 printf("%d: %d->%d\n", n, from, to); //最后挪动n-1个盘子从p2到p3 hanoi(n - 1, tmp, to, from); } 来源: oschina 链接: https://my.oschina.net/u

数据结构与算法之递归

一世执手 提交于 2019-12-28 19:43:39
递归: 定义:一个函数自己直接或间接调用自己 (不要写成死递归) 举例: 1. 1+2+3+4+...+100的和 求阶乘 汉诺塔 走迷宫 函数的调用(以 C语言为例) 当一个函数的运行期间调用另一个函数时,在运行被调用函数之前,系统需要完成三件事: 将所有的实际参数,返回地址(即调用函数的位置,等到调用函数执行完毕后返回这个位置,继续执行下面的代码)等信息传递给被调函数保存 为被调函数的局部变量(也包括形参)分配存储空间 将控制转移到被调函数的入口 从被调函数返回主调函数之前,系统也要完成三件事: 保存被调函数的返回结果 释放被调函数所占的空间(指静态空间,不包括 malloc动态分配的空间) 依照被调函数保存的返回地址将控制转移到调用函数 当有多个函数相互调用时,按照 “后调用先返回”的原则,上述函数之间信息传递和控制转移必须借助“栈”来实现,即系统将整个程序运行时所需的数据空间安排在一个栈中,每当调用一个函数时,就在栈顶分配一个存储区,进行压栈操作,每当一个函数退出时,就释放它的存储区,就进行出栈操作,当前运行的函数永远都在栈顶位置。 递归必须满足的条件 递归必须得有一个明确的终止条件 该函数所处理的数据规模必须在递减 这个转化必须是可解的 循环和递归 递归 易于理解 速度慢 存储空间大 循环 不以理解 速度快 存储空间小 汉诺塔伪算法 if(n > 1) { 先把

汉诺塔问题的解法

♀尐吖头ヾ 提交于 2019-12-28 19:42:50
汉诺塔问题移动N个盘子可以转化为先把N-1个盘子移动到b上面,再把最后一个盘子移动到C,最后把b上的N-1个盘子移动到C;其中N-1个盘子的移动和移动N-1个盘子的方式是一样的,只是把c换成了b,最后一个盘子移动到C之后,N-1个盘子再从b移过去就是把a换成了b。 #include<stdio.h> #include<stdlib.h> //汉诺塔问题 void hanoi(int n,char a,char b,char c) { if(n==1) printf("%c->%c\n",a,c); else { hanoi(n-1,a,c,b); printf("%c->%c\n",a,c); hanoi(n-1,b,a,c); } } int main() { int m; printf("请输入盘子的个数:\n"); scanf("%d",&m); printf("盘子移动的过程为:\n"); hanoi(m,'a','b','c'); system("pause"); return 0; } 没有显示完全 来源: https://www.cnblogs.com/whsll/p/6267172.html

C语言之算法初步(汉诺塔--递归算法)

蹲街弑〆低调 提交于 2019-12-28 19:42:30
个人觉得汉诺塔这个递归算法比电子老鼠的难了一些,不过一旦理解了也还是可以的,其实网上也有很多代码,可以直接参考。记得大一开始时就做过汉诺塔的习题,但是那时代码写得很长很长,也是不理解递归的结果。现在想起来汉诺塔的算法就3个步骤:第一,把a上的n-1个盘通过c移动到b。第二,把a上的最下面的盘移到c。第三,因为n-1个盘全在b上了,所以把b当做a重复以上步骤就好了。所以算法看起来就简单多了。不过,思考过程还是很痛苦的,难以理解。递归中会保存数据的好处在这里又得到体现,太神奇了。 汉诺塔代码如下: #include<stdio.h> void move( int n, char a, char b, char c) { if (n==1) printf ( "\t%c->%c\n" ,a,c); //当n只有1个的时候直接从a移动到c else { move(n-1,a,c,b); //第n-1个要从a通过c移动到b printf ( "\t%c->%c\n" ,a,c); move(n-1,b,a,c); //n-1个移动过来之后b变开始盘,b通过a移动到c,这边很难理解 } } main() { int n; printf ( "请输入要移动的块数:" ); scanf ( "%d" ,&n); move(n, 'a' , 'b' , 'c' ); } 来源: https:/

双色汉诺塔 算法 (递归)

十年热恋 提交于 2019-12-28 19:42:09
#include<stdio.h> //将n个盘子A->C借助B void move(int n,char a,char b,char c) { if(n==1) { printf("%c->%c\n",a,c); printf("%c->%c\n",a,c); } else { move(n-1,a,c,b); printf("%c->%c\n",a,c); printf("%c->%c\n",a,c); move(n-1,b,a,c); } } //根据颜色移动 void ColorTwoMove(int n,char a,char b,char c) { int i=n/2; //分两组,因为只是颜色不同,一次移动两个。 for(;i>1;i--) //下面主要是把两个颜色不一样,大小一样的分开放在两个柱子上。 { move(i-1,a,c,b); //将2*(i-1)个A->B借助C move(1,a,b,c); //将A上剩下的两个移动到C上 move(i-1,b,c,a); //将B上的2*(i-1)个 B->A借助C printf("%c->%c\n",c,b); //C上面现在是两个颜色不一样大小一样的盘子,将其中的1个C->B } //下面是最上面的两个的两个大小一样,颜色不一的最小的盘子 printf("%c->%c\n",a,c); //将第一个移动到C上