目录

前言

方法一:(简单粗暴)

方法二:(简化上面的思路)

后记


前言

代码风格不好,也是第一次写博客,还请大佬们谅解,有简便写法希望不吝赐教

搜了很久发现大佬们汉诺塔写的都很好,也清楚,但是有一道题要求把编号也打印出来,没有搜到对应的博客,所以写了此篇。

方法一:(简单粗暴)

首先定义,hanoit(int num, char a, charb, char c)表示将num个盘子从a经过b移动到c

move(char a, char c)表示将a最上面的盘子移动到c

每次只是移动最上面的,所以也就保证了,移动是符合规则的。

代码和注释写的应该比较直观了,get()函数写的比较复杂了,但是其实道理很简单

#include<stdio.h>int cnt = 0, no;
struct n{int idx[25]; //存放这个柱子从下到上的盘子, i = 1 开始存放int tot; //存放有多少个盘子
}A, B, C;int get(char src, char des){if(src == 'A'){if(des == 'B'){B.tot++; //B上面增加一个B.idx[B.tot] = A.idx[A.tot]; //B增加的是A最上面的A.tot--; // A减少一个}else if(des == 'C'){C.tot++;C.idx[C.tot] = A.idx[A.tot];A.tot--;}return A.idx[A.tot+1]; // 返回A最上面的是几号盘子}else if(src == 'B'){if(des == 'A'){A.tot++;A.idx[A.tot] = B.idx[B.tot];B.tot--;}else if(des == 'C'){C.tot++;C.idx[C.tot] = B.idx[B.tot];B.tot--;}return B.idx[B.tot+1];}else{if(des == 'A'){A.tot++;A.idx[A.tot] = C.idx[C.tot];C.tot--;}else if(des == 'B'){B.tot++;B.idx[B.tot] = C.idx[C.tot];C.tot--;}return C.idx[C.tot+1];}
}
void move(char a, char c){ // 将a此时最上面的盘子移动到ccnt ++;no = get(a, c); // a最上面的是什么printf("step #%d: move %d from %c to %c\n", cnt, no, a, c);
}
void hanoit(int num, char a, char b, char c){if(num == 1) move(a, c); // 如果只需要移动一个盘子,直接移动即可else{hanoit(num-1, a, c, b); //先将a从最上面开始数的num-1个盘子经过c移动到bmove(a, c); // a只剩下最下面的一个盘子了,直接移动hanoit(num-1, b, a, c); // 回到原问题,将b的num-1个盘子经过a移动到c,结束}
}
int main(){int n;scanf("%d", &n);no = n;//初始化for(int i = 1; i <= n; i++){A.idx[i] = i;B.idx[i] = 0;C.idx[i] = 0;}A.tot = n;B.tot = 0;C.tot = 0;hanoit(n, 'A', 'B', 'C');
}

方法二:(简化上面的思路)

首先定义,hanoit(int low, int high, char a, char b, char c)表示将a柱子从low编号到high编号的盘子,经过b移动到c.

move(int idx, char a, char c)表示将a柱子的idx编号的盘子移动到c.

#include<stdio.h>
int cnt = 0;void move(int idx, char a, char c){cnt ++;printf("step #%d: move %d from %c to %c\n", cnt, idx, a, c);
}
void hanoit(int low, int high, char a, char b, char c){if(low == high) move(high, a, c); // 也就是只移动一个盘子的时候else{hanoit(low+1, high, a, c, b); // a保留最下面的盘子,上面的全部移动到bmove(low, a, c); //a最下面的盘子直接移动到chanoit(low+1, high, b, a, c); // 回到原问题,将b柱子上所有柱子(从low+1到high)全部移动到c}
}
int main(){int n;scanf("%d", &n);hanoit(1, n, 'A', 'B', 'C');
}

后记

其实两种方法的时空效率接近,只是第二种方法看起来更简单一些。

汉诺塔之添加移动编号相关推荐

  1. 汉诺塔的实现 c++

    汉诺塔问题:假设有从左到右有三个名字分别为x,y,z的塔座, 在塔座x上有n各直径大小各不相同,按照直径从小到大编号为1,2,...n的圆盘.现在要求将x轴上的n个圆盘移动到塔座z上,并且按同样的顺序 ...

  2. NYOJ 93 汉诺塔 (数学)

    题目链接 描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片 ...

  3. 汉诺塔自动解题动画中的iOS开发技巧

    引 前段时间做了一道题,要求实现汉诺塔游戏的自动解题动画: 汉诺塔游戏应该都了解规则: 1.将盘子全部移动到塔C 2.每次只能移动一个圆盘: 3.大盘不能叠在小盘上面. 要求由用户输入盘子的数量,绘制 ...

  4. 汉诺塔(内部+伪图形)

    1.1问题描述: 假设有三个分别命名为A,B,C的塔座,在塔座A上插有n个直径大小各不相同的圆盘,大的在下,小的在上,且从小到大编号为1,2,3-.现要求将塔座A上的n个圆盘移到塔座C上并仍按同样的顺 ...

  5. JAVA(4)学习笔记:JVM虚拟机上的栈、大驼峰命名法和小驼峰命名法、实参和形参、重载方法、调用栈、递归练习(汉诺塔+斐波那契数列)、数组的定义、数组的初始化、增强for循环。

    接上次的博客:JAVA学习(3)--知识整理以及一些简单程序(猜数字游戏.求各种自幂数.求出一个数字的二进制位中1的个数.获取一个数二进制序列中所有的偶数位和奇数位.求公约数的多种实现方式.输入密码程 ...

  6. c语言汉诺塔动画程序,C语言实现的动画汉诺塔

    /*本程序实现C上的汉诺塔动画移动效果,如有建议可和我联系,QQ:928853003*/ /*编写者:杰 */ /*完成时间:2012年9月25日9:02*/ /*有部分函数可参见easyx帮助,运行 ...

  7. 汉诺塔(三)_栈的应用

    问题 E: 汉诺塔(三) 时间限制: 3 Sec  内存限制: 128 MB 提交: 2  解决: 2 [提交][状态][讨论版] 题目描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北 ...

  8. 轻松理解汉诺塔问题(图解java描述)

    引言:(易于理解) 汉诺塔看似简单的几行代码,却蕴含着奇妙的算法.我从我个人学习的角度来说.我一开始理解了原理,但是编码不会编,这也就是所谓的眼高手低.多研究多在IDE(eclipse-java,VS ...

  9. 利用递归、迭代解决斐波那契数列问题与汉诺塔难题

    有人说,"普通程序员使用迭代,天才程序员使用递归",真是这样吗? 1.浅谈递归与迭代 <1>递归的基本概念: 程序调用自身的编程技巧称为递归,是函数自己调用自己. 一个 ...

最新文章

  1. 关于C#中编译器保证变量必须初始化规则猜想
  2. java中是否支持多重继承_java支持多重继承吗 JAVA特性面试题:
  3. 国外10大IT网站和博客网站
  4. linux 快捷matlab_Linux命令 笔记(一)
  5. python中的正则表达式
  6. 打开Eclipse时出现Failed to create the Java Virtual Machine
  7. qt修改程序图标名称_解决Qt应用程序添加icon图标,修改窗口图标以及添加系统托盘问题...
  8. SQL SERVER 2005中如何获取日期(一个月的最后一日、一年的第一日等等)
  9. Jquery学习笔记:获取jquery对象的基本方法
  10. html session 登录页面跳转页面跳转页面,session失效后跳转到登陆页面
  11. Nexus3.x.x上传第三方jar
  12. 项目经理(project manager)刘小备的一天
  13. Python的模块千奇百怪,居然有自动发短信的模块?
  14. 经常有职场上的朋友问我,要怎么去轻资产创业?
  15. 询问区间内最大值-最小值
  16. SpringBoot+Shiro 学习之数据库动态权限管理和 Redis 缓存
  17. beta 发布的相关评论
  18. 硬件级光线追踪:移动游戏图形的变革时刻
  19. java加密方案:Virbox Protector Java版-全新保护方案
  20. 分享:查重软件(免费)

热门文章

  1. 【人工智能】什么是数据标注?
  2. 计算机耗材发放管理,医用耗材条码管理,让耗材管理更轻松
  3. 推荐一个下载电子书的站点,得益网
  4. Sweet Home 3D for Mac(3D室内装潢设计软件)
  5. iOS开发 mov视频文件转换成其他视频文件格式
  6. 计算机游戏活动总结,关于亲子游戏活动总结最新三篇
  7. 2019阿里校招测评——光明小学接力赛(Java)
  8. 计算机一级改扩展名,电脑文件扩展名怎么改(文件扩展名修改图文详解)
  9. Dataset之图片数据增强:设计自动生成(高级封装之命令行解析实现)汽车车牌图片算法(cv2+PIL+argparse)根据随机指定七个字符自动生成逼真车牌图片数据集(带各种噪声效果)
  10. 计算机64位地址总线,64位CPU和数据/地址总线的关系