汉诺塔问题分析总结

汉诺塔问题描述:

有三个柱子,其中一个柱子上从下往上放着直径依次增大的圆盘,要求把这些圆盘移动到另一个圆盘,移动的过程中不能使小的圆盘在大的圆盘下面,问如何移动。

分析:

递归的经典问题,不能太拘泥于细节的实现。

首先,来看倒数第二个局面,假设1,2,3柱,最大的圆盘在1柱,1到n-1个圆盘在3柱,现在只需要把1到n-1个圆盘移动到1柱,由于n的直径大于前n - 1个圆盘,那么1柱实际既可以看成空柱,因为我们不移动第n个,所以它的存在对结果不影响,所以现在就只剩移动n-1个圆盘的工作量。

这就跟移动n个圆盘的问题结构是一样的,只不过规模减小了1,所以,这就是递归的子问题。

我们每一次的移动,就只需要考虑把我们的目标柱子和中转柱子以及起始柱子的位置互换一下就ok了。

总结:

分析递归的问题,一般是寻找与最大的问题结构相同的子问题,然后逐渐减小问题规模,达到最终解决问题的目的。

代码:

 1 #include <stdio.h>
 2
 3 int cnt = 0;
 4
 5 void move(char from,char to)
 6 {
 7     printf("%d   %c -> %c\n",++cnt,from,to);
 8 }
 9
10 void hanota(int n,char from,char trans,char to)
11 {
12     if (n == 1) move(from,to);
13     else
14     {
15         hanota(n-1,from,to,trans);
16         move(from,to);
17         hanota(n-1,trans,from,to);
18     }
19 }
20
21 int main()
22 {
23     int n;
24
25     scanf("%d",&n);
26
27     hanota(n,‘A‘,‘B‘,‘C‘);
28
29     printf("Total times : %d\n",cnt);
30
31     return 0;
32 }
时间: 2024-10-01 00:37:55

汉诺塔问题分析总结的相关文章

脚本进击之汉诺塔tatatata……

操作环境依旧是centos7与centos6.阿拉的脚本都是放在7上了,6里的通用性大概有0.5%左右的误差,错误和可完善之处尽请指正. 请忽略中二的标题>_<. 嘛,某种意义上,这个标题还算贴切.因为这个问题咋一看到就是会给人一种头大的感觉,踏踏踏踏踏,塔塔塔塔塔塔-- 哦急死尅.先看过题目再来说头大的问题吧. 原题如下: 汉诺塔(又称河内塔)问题是源于印度一个古老传说.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着 64片黄金圆盘.大梵天命令婆罗门把圆盘从下面

4柱汉诺塔(zz)

多柱汉诺塔可以用Frame–Stewart算法来解决. The Frame–Stewart algorithm, giving a presumably optimal solution for four (or even more) pegs, is described below: Let be the number of disks. Let be the number of pegs. Define to be the minimum number of moves required t

汉诺塔递归解决方法经典分析

一位法国数学家曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面.僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔.庙宇和众生也都将同归于尽. 虽然这只是一个传说,但也给我们提出了一个问题,

基于Python的汉诺塔算法

首先贴出Python编写的汉诺塔算法的代码: def hanoti(n,x1,x2,x3):    if(n == 1):        print('move:',x1,'-->',x3)        return    hanoti(n-1,x1,x3,x2)    print('move:',x1,'-->',x3)    hanoti(n-1,x2,x1,x3) hanoti(3,'A','B','C') 汉诺塔问题归根结底就是一个循环问题,循环包括两大要素:循环体.循环结束条件 首

hd 1207(四汉诺塔)

三个汉诺塔算法 f(n)=2^n-1 两个思路大同小异 Frame算法 在1941年,一位名叫J. S. Frame的人在<美国数学月刊>上提出了一种解决四柱汉诺塔问题的算法,这是人们熟知的Frame算法: (1)用4柱汉诺塔算法把A柱上部分的n- r个碟子通过C柱和D柱移到B柱上[F( n- r )步]. (2)用3柱汉诺塔经典算法把A柱上剩余的r个碟子通过C柱移到D柱上[2^r-1步]. (3)用4柱汉诺塔算法把B柱上的n-r个碟子通过A柱和C柱移到D柱上[F(n-r)步]. (4)依据上

汉诺塔 python版

汉诺塔问题:如果将n个盘子(由小到大)从a通过b,搬到c,搬运过程中不能出现小盘子在大盘子下面的情况. 思路分析:假设前要移动第100个盘子,分两步走,移动第99个:再移动第100个:而要移动第99个,同样分两部,移动第98个,再移动第99个,以此类推: if(n>1) { 1.先将A柱上的前n-1个盘子从A借助C移动到B; 2.把A柱子上的第n个盘子直接移动到C: 3.再将B柱子上的n-1个盘子借助A移动到C; } 1 #!/usr/bin/python 2 #encoding=utf-8 3

nyoj89 汉诺塔(二)

题目网址 :http://acm.nyist.net/JudgeOnline/problem.php?pid=89 汉诺塔问题的经典结论: 把i个盘子从一个柱子整体移到另一个柱子最少需要步数是 2的i次方减一.那我们这个给定一个初始局面,求他到目标局面(全部移到第三个柱子上)需要的最少步数.怎么办呢!! 分析: 1.总的来说一定是先把最大的盘子移到第三个柱子上, 然后再把第二大的移到柱子3上, 然后再把第三大的盘子移到柱子3上.........直到把最小的盘子(1号盘子)移到柱子3上,才算结束.

CodeVs[3145 汉诺塔游戏]

题目描述 Description 题目描述 Description 汉诺塔问题(又称为河内塔问题),是一个大家熟知的问题.在A,B,C三根柱子上,有n个不同大小的圆盘(假设半径分别为1-n吧),一开始他们都叠在我A上(如图所示),你的目标是在最少的合法移动步数内将所有盘子从A塔移动到C塔. 游戏中的每一步规则如下: 1. 每一步只允许移动一个盘子(从一根柱子最上方到另一个柱子的最上方) 2. 移动的过程中,你必须保证大的盘子不能在小的盘子上方(小的可以放在大的上面,最大盘子下面不能有任何其他大小

【汉诺塔问题】UVa 10795 - A Different Task

[经典汉诺塔问题] 汉诺(Hanoi)塔问题:古代有一个梵塔,塔内有三个座A.B.C,A座上有64个盘子,盘子大小不等,大的在下,小的在上.有一个和尚想把这64个盘子从A座移到B座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上.在移动过程中可以利用B座,要求打印移动的步骤.如果只有一个盘子,则不需要利用B座,直接将盘子从A移动到C. 如果有2个盘子,可以先将盘子1上的盘子2移动到B:将盘子1移动到c:将盘子2移动到c.这说明了:可以借助B将2个盘子从A移