汉诺塔算法之求解最佳步数

写的不好,但是请尊重版权,转载请注明出处: http://www.cnblogs.com/xiaovw/

何为汉诺塔

  答:汉诺塔是根据一个传说形成的一个问题。汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

关于汉诺塔的经典问题

  有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,请问至少需要多少次移动。转载请注明出处: http://www.cnblogs.com/xiaovw/

题目要求:

  1.在小圆盘上不能放大圆盘。

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

  3.只能移动在最顶端的圆盘。

算法分析:

  在这里我们暂且只讨论到达制定目标所需的步数,不讨论移动的步骤。

  

  当只有一层的时候,只需一步便可从A到C:A -> C

  第二层将所有的盘子从A移动到C 有3种选择(不做演示,可在此链接内自行进行测试,http://www.4399.com/flash/49864_4.htm

  第三层 有7种选择

  第四层 有15种选择

  第五层 有31种选择

  。。。。

  

  由此测试数据:

    f( 1 ) = 1;

    f( 2 ) = 3 ;

    f( 3 ) = 7;

    f( 4 ) = 15;

    f( 5 ) = 31;

    .......

  可发现: f(n)= 2 * f(n-1)+ 1; (注意:测试f(1)时,f(0)=0)

    即:f(n)= 2^n - 1; 

/* f(n)= 2 * f(n-1)+ 1不验证,当64层时,数据长度太长*/1class Hannuota{
2    public static void main(){
3
4        Scanner sc= new Scanner(System.in);
5         int n=sc.nextInt;
6        System.out.println("走了"+Math.pow(2,n)-1+"步");
7     }
8 }    

   转载请注明出处: http://www.cnblogs.com/xiaovw/

时间: 2024-08-01 10:44:51

汉诺塔算法之求解最佳步数的相关文章

基于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') 汉诺塔问题归根结底就是一个循环问题,循环包括两大要素:循环体.循环结束条件 首

Java算法分析2—————几种排序&汉诺塔算法

一:插入排序 /* * 插入排序 */ /* * 原序列 [12] 15 9 20 6 31 24 * 第0趟 [12 15] 9 20 6 31 24 * 第1趟 [9 12 15] 20 6 31 24 * 第2趟 [9 12 15 20] 6 31 24 * 第3趟 [6 9 12 15 20] 31 24 * n个数,一共需要多少趟?n个数,n-1趟 * 第0趟,把1位置的数,和1位置之前的数进行比较,按大小顺序排列 * 第1趟,把2位置的数,和2位置之前的数进行比较,按大小顺序排列 .

20150410 递归实现汉诺塔算法

20150410 递归实现汉诺塔算法 2015-04-10 Lover雪儿 1 //汉诺塔 2 #include <stdio.h> 3 4 static int i = 0; 5 6 //将n个盘子从x借助y移动z 7 //n:移动的个数 x:源地址 y:中间柱子 z:目的柱子 8 void move(int n, char x, char y, char z) 9 { 10 if(1 == n){ 11 printf("第%d次移动 %c--->%c\n", ++

汉诺塔算法演示1.0

工作之余闲来无聊,于是就有了用JS来实现算法演示的想法,很久以前用JS实现过选择排序,不过源程序找不到了! 汉诺塔的递归算法: 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); mo

汉诺塔算法

首先介绍下汉诺塔: 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘. 算法思想: 主要是递归方法的使用:假设有A.B.C三根柱子,用户输入盘子的数目,开始的时候盘子全部在A上,通过B将所有的盘子移动到C上. 盘子数目为n 1.当n=1时,直接将A上的盘子移到C上

【数据结构与算法】汉诺塔算法——java递归实现

汉诺塔的递归实现算法,将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次 public class

汉诺塔算法的理解

当盘子数为两个时,移动图如下: 移动规律为: 步骤 盘子编号 源柱子 目标柱子 1 1 A B 2 2 A C 3 1 B C 当盘子数为3个时: 移动规律为: 步骤 盘子编号 源柱子 目标柱子 1 1 A C 2 2 A B 3 1 C B 4 3 A C 5 1 B A 6 2 B C 7 1 A C 从以上移动移动规律可以总结出,当步骤序号和盘子数目相同时,就是把最底下的盘子从A移动到C,其它的步骤都是对等的,规律如下: 中间以上动作是:源柱子(A)不变,目标柱子为C,辅助柱子为B进行移动

【Python实践-3】汉诺塔问题递归求解

1 # -*- coding: utf-8 -*- 2 #汉诺塔移动问题 3 # 定义move(n,a,b,c)函数,接受参数n,表示3个柱子A.B.C中第1个柱子A的盘子数量 4 # 然后打印出把所有盘子从A借助B移动到C的方法 5 def move(n,a,b,c): 6 if n==1: 7 print('move', a, '-->', c) 8 else: 9 move(n-1,a,c,b) 10 move(1,a,b,c) 11 move(n-1,b,a,c) 12 move(5,'

汉诺塔算法学习-C代码

#include <stdio.h> void main() {   extern a;   extern b;   extern c;   extern s;   void hanno(int,char,char,char);   void setNum(int);   int n;   printf("Please input the number of dishes: ");   scanf("%d",&n);   printf("