当前位置: 首页 > news >正文

讨论汉诺塔之谜

汉诺塔是数学上的一个谜题。有三根杆子,一些不同大小的中间有孔的圆盘,可以按大小顺序套在杆子上,最小的在最上面,堆成类似锥形的结构。问题是怎么把一根杆子上的一堆圆盘移动到另一根杆子上,限定条件如下:

一次只能移动一个圆盘。

每一次移动步骤包括将一根杆子最上面的圆盘移开放到另一根杆子上圆盘的最上层(不能动下面的盘子)。

所有大圆盘的下面不能有比他小的圆盘。

算法步骤(有n个圆盘,三根杆子分别为A,B,C,要将所有盘子从A上移动到B上)

将A上面的n-1个圆盘移动到C上。

将A上面最后一个圆盘移动到B上。

将C上面的n-1个圆盘移动到B上。

从C上移动n-1个圆盘到B上我们如法炮制。一旦我们解决n=3的情况,我们就能解决任何数量的盘子了。

void towerOfHanoi(int n, char fromPeg, char toPeg, char auxPeg)
{
    //If only one disk, make a move and return :: base case
    if(n == 1)
    {
        printf("Move disk 1 from peg %c to peg %c ",fromPeg, toPeg);
        return;
    }
    //Move top n-1 disks from A to B, using C as auxiliary
    towerOfHanoi(n-1, fromPeg, auxPeg, toPeg);
 
    //Move remaining disks from A to C
    printf("\nMove disk %d from peg %c to peg %c ",n, fromPeg, toPeg);
 
    //Move n-1 disks from B to C using A as the auxiliary
    towerOfHanoi(n-1, auxPeg, toPeg, fromPeg);
}

假设我们传递这样的参数:

towerOfHanoi(3, 'A'. 'B', 'C');

输出如下:

Move disk 1 from peg A to peg B
Move disk 2 from peg A to peg C
Move disk 1 from peg B to peg C
Move disk 3 from peg A to peg B
Move disk 1 from peg C to peg A
Move disk 2 from peg C to peg B
Move disk 1 from peg A to peg B

注:代码不长,但理解代码的运行过程可能需要动一些脑筋,我在最后附上完整代码,或许你需要参考我前面的内容递归和内存分配(可视化)

#include<stdio.h>
#include<stdlib.h>
/*
Code obtained from

http://www.studyalgorithms.com
*/
void towerOfHanoi(int n, char fromPeg, char toPeg, char auxPeg)
{
    //If only one disk, make a move and return :: base case
    if(n == 1)
    {
        printf("Move disk 1 from peg %c to peg %c \n",fromPeg, toPeg);
        return;
    }
    //Move top n-1 disks from A to B, using C as auxiliary
    towerOfHanoi(n-1, fromPeg, auxPeg, toPeg);
 
    //Move remaining disks from A to C
    printf("Move disk %d from peg %c to peg %c \n",n, fromPeg, toPeg);
    /*
    Feel free to copy but please acknowledge studyalgorithms.com
    */
 
    //Move n-1 disks from B to C using A as the auxiliary
    towerOfHanoi(n-1, auxPeg, toPeg, fromPeg);
}

int main(void)
{
    printf("Enter the number of disks:- ");
    int disks;
    scanf("%d",&disks);
    towerOfHanoi(disks,'A','B','C');
    return 0;
}

转载于:https://www.cnblogs.com/programnote/p/4713515.html

相关文章:

  • 11g中关于控制文件自动备份的改进
  • linux自定义脚本添加到rc.local脚本无法正常运行的问题
  • python 在终端打印各种颜色的字体的方法
  • Spring MVC配置文件的三个常用配置详解
  • 什么是全栈呢(转)
  • MongoDB基于GridFS管理文件
  • js eval()方法处理json字符串
  • 邮件原理你真的造吗
  • hdu 4841 圆桌问题(STL vector)
  • WPF获取窗口句柄
  • PHP面向对象static和const的两段代码示例
  • 安卓飞机大战(二) SurfaceView实现自制背景
  • PHP基础知识
  • JLOI 2013 卡牌游戏
  • Andriod下载源码导入后AndroidManifest.xml小红叉的解决办法
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • ECS应用管理最佳实践
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • JavaScript函数式编程(一)
  • java多线程
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • ReactNativeweexDeviceOne对比
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 码农张的Bug人生 - 初来乍到
  • 入门级的git使用指北
  • 数据结构java版之冒泡排序及优化
  • 小程序开发中的那些坑
  • 学习笔记:对象,原型和继承(1)
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 【云吞铺子】性能抖动剖析(二)
  • Nginx实现动静分离
  • puppet连载22:define用法
  • raise 与 raise ... from 的区别
  • 我们雇佣了一只大猴子...
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (三)elasticsearch 源码之启动流程分析
  • (一)Linux+Windows下安装ffmpeg
  • (转)用.Net的File控件上传文件的解决方案
  • *p++,*(p++),*++p,(*p)++区别?
  • .NET 材料检测系统崩溃分析
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • /usr/bin/env: node: No such file or directory
  • @Autowired自动装配
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • @Transactional 竟也能解决分布式事务?
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——
  • [20171113]修改表结构删除列相关问题4.txt
  • [acwing周赛复盘] 第 94 场周赛20230311