C语言-汉诺塔问题详解
C语言经典递归题——汉诺塔
涉及知识:变量-形实参--函数-判断-递归
一、介绍
汉诺塔:汉诺塔(Tower of Hanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子,
其中一根柱子自底向上叠着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
二、题目
现有三根杆子A, B, C。
A杆上有N个(N>1) 穿孔圆盘, 盘的尺寸由下到上依次变小.要求按下列规则将所有圆盘移至C杆:
1.每次只能移动一个圆盘
2.小圆盘上不能放大圆盘
可将圆盘临时置于B杆, 也可将从A杆移出的圆盘重新移回A杆, 但都必须尊循上述两条规则。求移动的过程。
画图分析:
当有2个盘时移动过程为:
A->B A->C B->C
- 将 A 座上 1 个盘子移到 B 座上
- 将 A 座上 1 个盘子移到 C 座上
- 将 B 座上 1 个盘子移到 C 座上
当有3个盘子时移动过程为:
A ->C A->B C->B A->C B->A B->C A->C
- 将 A 座上 2 个盘子移到 B 座上(借助 C)
- 将 A 座上 1 个盘子移到 C 座上
- 将 B 座上 2 个盘子移到 C 座上(借助 A)
由此可以推出:移动 n 个盘子要经历 2 n次方-1 步。当有n个圆盘时,可以先借助c柱子把较小的n-1个圆盘全都移动到b柱子上,再把a柱子上剩下的最大的一个圆盘移动到c柱子上。这时候b柱子上有n-1个圆盘,需要再借助a柱子把剩下的n-1个圆盘移动到c柱子上,其实就相当于a柱子上有n-1个圆盘的情况。这样就可以用递归的方法来求解。
接下来我们来看代码
#include<stdio.h>
void move(int n,char x, char y)
{ //输出移盘方案printf("第%d个圆盘%c-->%c\n",n,x,y); //这里n代表第几个圆盘,第一个为最上面的圆盘,第n个为最底部的圆盘
} //x,y代表A,B,C座之一,根据每次的不同情况分别取A,B,C代入
int count=0; //声明全局变量count
int Hanoi(int n,char a,char b,char c)//n个圆盘从起始座a移动到目标座c,b作为其中的中介座
{if( n==1 ){move(n,a,c);count++;return count;}else{Hanoi(n-1,a,c,b); //将A杆上n-1个圆盘从起始座a移动到目标座b,c作为中介座move(n,a,c);count++;Hanoi(n-1,b,a,c); //将B杆上n-1个圆盘再从起始座b移动到目标座c,a作为中介座 }
}
int main()
{char x='A';char y='B';char z='C';int num=0;printf("请输入圆盘个数:");scanf("%d",&num); printf("以下是移动的过程:\n");Hanoi(num,x,y,z);printf("总共移动%d步\n",count); return 0;
}
以上就是经典递归题汉诺塔
C语言-汉诺塔问题详解相关推荐
- c语言中的汉诺塔问题详解
汉诺塔问题是一个古典的数学问题,也是c语言学习中一个用递归方法解题的典型实例,我们先看一下原题. 相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏.该游戏是在一块铜板装置上,有三根杆(编号A ...
- 汉诺塔问题详解 递归实现 C语言
目录 一.前言 二.游戏规则 三.思路讲解 四.完整代码 五.最终结果展示 一.前言 汉诺塔:汉诺塔(Tower of Hanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子, 其中一根柱子 ...
- Tower of Hanoi(汉诺塔)详解
一个经典的汉诺塔问题,带着我自己的理解给做这个问题的友友们解决一下,包括我本人在做的时候也遇到的一些问题给大家阐述一下.话不多说,来看: 汉诺塔 问题描述: 汉诺塔(Hanoi Tower),又称河内 ...
- QT汉诺塔项目详解:多线程动画
关注QT坐标,多线程动画中坐标的变化.汉诺塔都是吃要的. 我的汉诺塔新解:一种更美的描述. http://blog.csdn.net/weixin_39788534/article/details/7 ...
- python之汉诺塔问题详解
#汉诺塔问题 传说古老印度在一个圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片圣庙,一块黄铜板上插着三根宝石针.印度教的主神梵 ...
- 算法 汉诺塔-java详解
第一次看到这个算法时,很懵逼,是在栈那里.想了半天没想到半点跟栈有关系的解法.最后看了答案,是用的递归.但是看了答案还是很懵逼,下面就是博主自己对汉诺塔的一些了解. 有三根木桩,第一根上有n个盘子,最 ...
- 走进递归经典——汉诺塔问题详解
目录 传统艺能
- c语言汉诺塔实验报告,C语言汉诺塔的简单了解
汉诺塔详解 以4层为例 以下为我的拙见,还希望大佬雅正 要把汉诺塔移动到c 需要把1,2,3层移到b 把4移动到c 在吧123移动到b 但是一次只能动一块 所以我们目前要做的就是把上面三块移动到b 那 ...
- C语言 - 汉诺塔详解(最简单的方法,进来看看就懂)
文章目录 一.什么是汉诺塔? 二.如何实现捏? 三.如何写代码? 四.为什么需要移动 2^n - 1 次/ 一.什么是汉诺塔? 汉诺塔起源于印度的一个古老传说,传说是什么不重要.重要的是它是怎么实现的 ...
- c语言 汉诺塔游戏下载,使用C语言解决益智游戏——“汉诺塔”
说明: 文章所有内容截选自实验楼教程[3个C语言实例带你掌握递归方法论],教程里还有两个实例,感兴趣的可以点击查看: 文章主要是带你通过解决这个游戏来利用递归解决实际问题并掌握其核心思想,懂得如何使用 ...
最新文章
- 剑指offer--求1+1+3+....n的和
- 研究生导师一般希望招什么样的研究生?
- pandas之dataframe去掉冗余行以及左连接合并dataframe
- SunnyOS准备4
- 推荐一款焦点图jQuery插件 SlidesJs
- 车联网登录显示连接不上服务器,车联网,如何解决连接的问题?
- 个人收集的IT技术网站集合,涉及web前后端,大数据,UI设计等。
- python实现12306查询火车票
- 为何日本手机走不出国门—iFanr版
- 阶段小练—篮球比赛计分器
- 用python做一个简单的猜拳游戏
- 正则表达式验证中文或者英文
- ubuntu删除旧的linux内核
- datasets: mnist
- 笔记本重置找不到恢复环境_win10重置此电脑恢复环境找不到要如何处理
- 计算机图形学(一)——辐照度学概述
- php布尔教育,布尔教育2016PHP加强视频教程
- python求字典的平均值_python求字典的平均值_获取字典列表中值的平均值
- BLDC无刷直流电机之电机驱动的方案总结
- 3D bounding box网络简化