汉诺塔算法学习-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("The following is moving %d dishes ...\n             (%2d  0  0)\n",n,n);
  setNum(n);
  hanno(n,‘A‘,‘B‘,‘C‘);
}
int a;
int b;
int c;
int s;
void setNum(int m)
{
  a=m;
}
void hanno(int m,char pillar1,char pillar2,char pillar3)
{
  void move(char,char,int);
  if(m==1) {
    s++;
    move(pillar1,pillar3,s);
  } else {
    hanno(m-1,pillar1,pillar3,pillar2);
    s++;
    move(pillar1,pillar3,s);
    hanno(m-1,pillar2,pillar1,pillar3);
  };
}
void move(char x,char y,int s)
{
  if (x==‘A‘ && a>0 ) a--;
  else if (x==‘B‘ && b>0 ) b--;
  else if (x==‘C‘ && c>0 ) c--;
  
  if (y==‘A‘) a++;
  else if (y==‘B‘) b++;
  else if (y==‘C‘) c++;
  printf("%3d: %c --> %c (%2d %2d %2d)\n",s,x,y,a,b,c);
}

#gcc hannuota.c -o hannuota

# ./hannuota
Please input the number of dishes: 3
The following is moving 3 dishes ...
             ( 3  0  0)

1: A --> C ( 2  0  1)
  2: A --> B ( 1  1  1)
  3: C --> B ( 1  2  0)
  4: A --> C ( 0  2  1)
  5: B --> A ( 1  1  1)
  6: B --> C ( 1  0  2)
  7: A --> C ( 0  0  3)

时间: 2024-10-10 10:50:48

汉诺塔算法学习-C代码的相关文章

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

汉诺塔算法演示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

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

一:插入排序 /* * 插入排序 */ /* * 原序列 [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", ++

汉诺塔算法

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

汉诺塔算法的理解

当盘子数为两个时,移动图如下: 移动规律为: 步骤 盘子编号 源柱子 目标柱子 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进行移动

【数据结构与算法】汉诺塔算法——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

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

写的不好,但是请尊重版权,转载请注明出处: http://www.cnblogs.com/xiaovw/ 何为汉诺塔? 答:汉诺塔是根据一个传说形成的一个问题.汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘. 关于汉诺塔的经典问题: 有三根相邻的柱子,标号为A,

2019.1.8兔子问题和汉诺塔问题的解决代码

#兔子问题用递归法解决 def factorial(n): if n<1: print("输入有误,请返回重新输入!") return -1 if n==1 or n==2: return 1 else: return factorial(n-1)+factorial(n-2) number=int(input("请输入兔子繁殖的朋数:")) result=factorial(number) if result !=-1: print("%d月后生%