汉诺塔问题
2015-06-05 21:29
218 查看
#include <stdio.h> #include <stdlib.h> /* **法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说: **在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜 **板上插着三根宝石针。印度教的主神梵天在创造世界的时 **候,在其中一根针上从下到上地穿好了由大到小的64片金 **片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣 **在按照下面的法则移动这些金片:一次只移动一片,不管 **在哪根针上,小片必须在大片上面。僧侣们预言,当所有 **的金片都从梵天穿好的那根针上移到另外一根针上时,世 **界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同 **归于尽 */ /* **这其实是一个经典的递归问题 **可以这样的考虑: **-先将前63个盘子移动到Y上,确保大盘在小盘下。 **-再将最底下的第64个盘子移动到Z上。 **-最后将Y上的63个盘子移动到Z上。 **问题一:将X上的63个盘子借助Z移到Y上 **-先将前62个盘子移动到Z上 **-再将最底下的第63个盘子移动到Y上 **-最后将Z上的62个盘子移动到Y上 **问题二:将Y上的63个盘子借助X移到Z上 **-先将前62个盘子移动到X上 **-再将最底下的第63个盘子移动到Z上 **-最后将X上的62个盘子移动到Y上 */ /*将n个盘子从X借助Y移动到Z*/ void move(int n,char x,char y,char z) { if(n==1) { printf("%c->%c\n",x,z); } else { move(n-1,x,z,y); //将n-1个盘子从x借助z移到y上 printf("%c->%c\n",x,z); move(n-1,y,x,z); //将第n个盘子从x移到z上 } } int main() { int n; printf("请输入汉诺塔的层数:"); scanf("%d",&n); printf("移动的步骤如下:\n"); move(n,'x','y','z'); return 0; }
相关文章推荐
- 1244的起源
- 动作加速度Speed
- pgrep的用法
- 工程Makefile实例
- Stochastic Gradient Descent 随机梯度下降法-R实现
- 随笔
- hdu 2795 Billboard 线段树 点更新
- 面试经历1
- SQLite数据库框架ORMLite与GreenDao的简单比较
- 内部类
- ViewPager实现页面滑动的学习与使用
- 工作十二载,第一次实施自己换工作的想法,面试总结
- Valid Parentheses
- AVL树旋转操作图解
- IO系统
- HDU 不容易系列之(4)——考新郎
- 【教材】 用Cheat Engine查找特殊码(简易版)
- Tomcat安全配置及优化
- HDU 钥匙计数之一
- 弗罗贝尼乌斯范数(Frobenius norm)