zoukankan      html  css  js  c++  java
  • 汉诺塔(河内塔)算法 ----C语言递归实现

     汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,

    在一根柱子上从下往上按照大小顺序摞着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 移动到 %c
    ",n,x,z);
     9      else
    10      {
    11     move(n-1,x,y,z);
    12         printf("圆盘编号 %d:从 %c 移动到 %c
    ",n,x,z);
    13         move(n-1,y,x,z);
    14      }
    15 
    16 }
    17 
    18 
    19 int main()
    20 {
    21     //A,B,C分别代表三个柱子
    22     char ch1 = 'A';
    23     char ch2 = 'B';
    24     char ch3 = 'C';
    25 
    26 
    27     int n;   //n代表圆盘的个数
    28     printf("请输入圆盘的个数:");
    29     scanf("%d",&n);
    30     move(n,ch1,ch2,ch3);
    31     
    32     return 0;
    33     
    34 }

    关于这个运行时间,,我也是醉了。。。。。。。。。。。。。。。。。。。。。。。。。。

  • 相关阅读:
    Doing Homework 简单dp&&状态压缩
    嫖裤子序列
    王宁宁宁
    友军寻路法
    Viviani
    ccf 201909-3
    ccf 201909-5
    链式前向星
    ccf-201909-04
    ccf -201909-2
  • 原文地址:https://www.cnblogs.com/wyuzl/p/6180955.html
Copyright © 2011-2022 走看看