C语言汉诺塔的简单了解
汉诺塔详解
以4层为例
以下为我的拙见,还希望大佬雅正
要把汉诺塔移动到c 需要把1,2,3层移到b 把4移动到c 在吧123移动到b
但是一次只能动一块 所以我们目前要做的就是把上面三块移动到b
那就需要把1 2移动到c
由此我们可以推出要把1,2移动到c,只需要把1移动到b
这里我们发现有很多重复的自相似动作
我们就可以设计递归 递归需要1,递归体 2 出口。
递归体
移动n-1个盘子和1个盘子和n个盘子过程都是相似的
但是每次放入的杆子不一样。
出口
n=1时只剩一个盘子,直接移动到c即可
hanoi(n ,A , B , C)
N 移动数量
A 出发地
B 借助地
C 终点
这个函数的意思就是有n个盘子从A出发借助B来到C
现在有n层汉诺塔 就需要把上面n-1层移动到B
hanoi(n-1,A,C,B)
这个函数就是我们要把n-1个盘子从A借助C移动到B
move(a,c)现在不需要再借助了 可以直接从a移动到c
接下来我们就要借助A吧剩下n-1个盘子移动到C了
hanoi(n-1,B,A,C)即可完成
递归出口
n<=1
在这里插入代码片 ```// 汉诺塔问题 //输出移动的步骤 #include <stdio.h> //记录步数 int i = 1; //n 第几号盘移动, from 移动塔 to 目标塔 void move(int n, char from, char to) { printf("第%d次移动第%d号盘: %c----->%c\n", i++, n, from, to); } void hanoi(int n, char from, char mid, char to) { if (n == 1) { move(n, from, to);//只有一个盘子是直接将初塔上的盘子移动到目的地 }//函数出口 else { hanoi(n - 1, from, to, mid);//先将初始塔的前n-1个盘子借助目的塔移动到借用塔上 move(n, from, to); //将剩下的一个盘子移动到目的塔上 hanoi(n - 1, mid, from, to);//最后将借用塔上的n-1个盘子移动到目的塔上 } } int main() { printf("请输入盘子的个数:\n"); int n; scanf_s("%d", &n); char x = 'A', y = 'B', z = 'C'; printf("盘子移动情况如下:\n"); hanoi(n, x, y, z); return 0; }
总结
到此这篇关于C语言汉诺塔的文章就介绍到这了,更多相关C语言汉诺塔内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
相关推荐
-
C语言实现汉诺塔游戏
操作就是:A B 号码A的塔顶一层放在号码B的塔顶.如1(空格) 3 回车. 话说有人能把我这C的代码添加到QT界面框架上去么? 代码写的不好 ,维护性不够,只能玩8层的,写完以后发现很难拓展,软件工程,设计模式有待提高.... 里面提示输入等级的装B用了,没有实现,大家随便输入个个位数就可以玩了. stackfunc.c #include"STACK.h" #include<stdio.h> extern ceng CENG[SIZE]; //数据入栈 void pus
-
C++ 汉诺塔问题知识点总结
汉诺塔问题,是心理学实验研究常用的任务之一.当然我们是学计算机的,因此我们尝试用计算机去求解它. 例题 openjudge6261 汉诺塔问题 描述 有一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下.由小到大顺序串着由n个圆盘构成的塔.目的是将最左边杆上的盘全部移到中间的杆上,条件是一次只能移动一个盘,且不允许大盘放在小盘的上面.这就是著名的汉诺塔问题. 假定圆盘从小到大编号为1,2,3,-- 输入 输入为一个整数后面跟三个单字符字符串. 整数为盘子的数目,后三个字符表示三个杆子的编号
-
C++实现汉诺塔算法经典实例
本文所述为汉诺塔算法的C++代码的经典实现方法. 汉诺塔问题描述:3个柱为a.b.c,圆盘最初在a柱,借助b柱移到c柱.需要你指定圆盘数. 具体实现代码如下: #include <iostream> using namespace std; int times = 0; //全局变量,搬动次数 //第n个圆盘从x柱搬到z柱 void move(int n, char x, char z) { cout << "第" << ++times <&l
-
C++基于递归算法解决汉诺塔问题与树的遍历功能示例
本文实例讲述了C++基于递归算法解决汉诺塔问题与树的遍历功能.分享给大家供大家参考,具体如下: 递归是把问题转化为规模缩小的同类问题,然后迭代调用函数(或过程)求得问题的解.递归函数就是直接或间接调用自身的函数. 递归两要素:递归关系和递归边界(终止条件),递归关系确定了迭代的层次结构,需要深入了解并分解问题:终止条件保证了程序的有穷性. 递归的应用有很多,常见的包括:阶乘运算.斐波那契数列.汉诺塔.数的遍历,还有大名鼎鼎的快排等等.理论上,递归问题都可以由多层循环来实现.递归的每次调用都会消耗
-
c语言 汉诺塔算法代码
复制代码 代码如下: #include<stdio.h> void move(char a,char b) { printf("%c->%c\n",a,b); } void han(int n,char a,char b,char c) { if(n>0) { han(n-1,a,c,b); move(a,b); han(n-1,c,b,a); } } int main() {
-
C++ 实现汉诺塔的实例详解
C++ 实现汉诺塔的实例详解 前言: 有A,B,C三塔,N个盘(从小到大编号为1-N)起初都在A塔,现要将N个盘全部移动到C塔(按照河内塔规则),求最少移动次数以及每次的移动详细情况. 要求: 需要采用递归方法和消除尾递归两种方法编写. 盘数N由用户从标准输入读入,以一个整数表示,然后请调用两个方法按照下面例子所述分别在屏幕中输出结果(正常情况下一个输入数据会显示同样的输出结果2次). 实现代码: #include<iostream> using namespace std; void mov
-
C语言汉诺塔的简单了解
汉诺塔详解 以4层为例 以下为我的拙见,还希望大佬雅正 要把汉诺塔移动到c 需要把1,2,3层移到b 把4移动到c 在吧123移动到b 但是一次只能动一块 所以我们目前要做的就是把上面三块移动到b 那就需要把1 2移动到c 由此我们可以推出要把1,2移动到c,只需要把1移动到b 这里我们发现有很多重复的自相似动作 我们就可以设计递归 递归需要1,递归体 2 出口. 递归体 移动n-1个盘子和1个盘子和n个盘子过程都是相似的 但是每次放入的杆子不一样. 出口 n=1时只剩一个盘子,直接移动到c即可
-
带你理解C语言中的汉诺塔公式
目录 汉诺塔公式 汉诺塔问题在数学层面的公式: C语言递归公式 两层汉诺塔 三层汉诺塔 总结 汉诺塔公式 汉诺塔问题在数学层面的公式: 不用说,你看到这个公式一定一脸懵逼,我现在来讲解这个公式的作用. 先来回想一下大象放冰箱要几步,三步吧,打开冰箱,放进去,关上门就行了,我们先不要去思考一些细碎的步骤,将一个复杂的问题先简单化,再慢慢去分析. 那汉诺塔问题也是同样的简单三步:(假设有n个盘子) 一.把最大的盘子留在A柱,然后将其他的盘子全放在B柱. 二.把最大的盘子放到C柱. 三.然后将B柱上的
-
C语言用递归函数实现汉诺塔
目录 汉诺塔(Hanoi)是什么? 那么,C语言如何实现汉诺塔呢? 汉诺塔的基本思路是: 具体代码见下(注意点在代码下面): 总结 汉诺塔(Hanoi)是什么? 一个简单的汉诺塔就如上图所示,有三个放置点,放置物必须遵循上小下大的规则,依次将1中的放置物全部放置到3中.就比如该图中有4个放置物,若将A上的放置物全部移至C上,具体的步骤是:A->B A->C B->C A->B C->A C->B A->B A->C B->C B->A C->
-
C语言超详细讲解递归算法汉诺塔
目录 题目描述 画图分析 思路总结 代码实现 总结 题目描述 汉诺塔问题起源于一个传说 汉诺塔又被称为河内塔,传说,在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针. 印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔. 不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面. 僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而
-
C语言递归思想实现汉诺塔详解
目录 1.递归思想简介 2.汉诺塔问题 3.汉诺塔递归的c语言实现 总结 1.递归思想简介 在c语言中,程序调用自身的编程技巧称为递归( recursion). 递归的定义看上去似乎很抽象,使用代码描述能够让人容易理解,下面是一个函数递归的例子. /* 递归求n的阶乘 */ int factorial(int n) //定义一个求阶乘的函数叫做factorial(),需要一个整形参数,返回一个整形值 { if (n <= 1) //递归结束的条件 { return 1; } else { ret
-
c语言循环加数组实现汉诺塔问题
目录 简介 递归的汉诺塔解法(c语言) 循环实现汉诺塔问题(c语言) 简介 汉诺塔问题是学数据结构与算法的时候会遇到的问题,相信来看本文的读者应该都对汉诺塔问题有基本的了解,理论上所有的递归都可以改成循环,常规的做法是借助堆栈,但是我一想好像用循环加数组也可以实现,于是就有了本文,实现声明,本文最后出来的算法效率不高的,比直接用递归实现还要差很多,追求算法效率的同学就不用看这个了.题目:假设有3个柱子,分别为A.B.C,A柱子上有数量为n个的空心圆盘,从上到下序号分别为1...n,要求把A柱子中
-
C语言运用函数的递归实现汉诺塔
目录 1.汉诺塔是如何实现的 2.汉诺塔问题画图详解 3.汉诺塔问题代码解释 总结 1.汉诺塔是如何实现的 下面是有三个盘子的示例: 从左到右一次是 A柱 B柱 C柱 A柱:起始位置 B柱:目标位置 C柱:过度位置 汉诺塔为题即是,将A柱上的所有盘子移动到B柱上,且每次只能移动一个盘子,并且小盘子必须在大盘子上面 2.汉诺塔问题画图详解 下面的例子是以A柱为起始位置,B柱为中间位置,C柱为目标位置的 如果初始状态下:A柱只有一个盘子:A->C A柱有两个盘子:A->B A->C B-&g
-
C 语言基础实现青蛙跳台阶和汉诺塔问题
目录 一.青蛙跳台阶 题目 思路 分析 1. 从跳法次数分析 2. 从过程分析 二.青蛙跳台阶变式1 题目 分析 三.青蛙跳台阶变式2 题目 分析 四.汉诺塔问题(求步数) 题目 思路 分析 五.汉诺塔问题(求移动过程) 题目 思路 分析 一.青蛙跳台阶 题目 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个 n 级的台阶总共有多少种跳法 思路 遇见题目我们可以在纸上先动手画画,把最简单的几种方式列出来,作比较,找规律. 分析 按照上面表格可以从跳法次数,过程,或者两者结合找规
随机推荐
- python线程锁(thread)学习示例
- 在Javascript类中使用setTimeout第1/2页
- Javascript闭包(Closure)详解
- Redis在Laravel项目中的应用实例详解
- Thinkphp5.0自动生成模块及目录的方法详解
- 详解C#中三个关键字params,Ref,out
- C#实现移除字符串末尾指定字符的方法
- Android自定义View实现随手势滑动控件
- 10个实用的PHP正则表达式汇总
- 了解一点js的Eval函数
- Bootstrap滚动监听组件scrollspy.js使用方法详解
- Android实现从activity中停止Service的方法
- JS中使用DOM来控制HTML元素
- JS和jQuery使用submit方法无法提交表单的原因分析及解决办法
- JS 实现可停顿的垂直滚动实例代码
- Python中使用ElementTree解析XML示例
- C#.NET 图片水印添加代码
- Android微信抢红包功能的实现原理浅析
- C++ pair的用法实例详解
- C# 字符串处理小工具