首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C语言解决汉诺塔问题【C语言&汉诺塔】

问题背景 汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。...运用函数递归解决汉诺塔问题 函数递归的思想就是将复杂的问题简单化 我们可以先考虑2个圆盘的情况下,先a->b然后a->c最后b->c 我们在考虑3个圆盘的情况,用图片表示 通过这两个例子我们可以观察到要将...n个盘子移动到C 就要先将n-1个盘子移动到B,由此我们可以已得到一个思路 代码实现的思路主要为三步: 假设移动n个盘子 1.将A柱上的n-1个盘子借助C柱移动到B柱 2.再将A柱上仅剩的最后一个盘子移动到...B柱 3.最后再将B柱上的n-1个盘子借助A柱移动到C柱 代码实现 #include void move(char pos1,char pos2)//打印过程 { printf...("%c->%c ", pos1, pos2); } void Hanoi(int n,char pos1,char pos2,char pos3)//pos1起始柱 pos2为工具柱 pos3为目标柱

12710

经典递归解决汉诺塔_c语言汉诺塔递归算法

当A塔上有两个盘子是,先将A塔上的1号盘子(编号从上到下)移动到B塔上,再将A塔上的2号盘子移动的C塔上,最后将B塔上的小盘子移动到C塔上。...当A塔上有3个盘子时,先将A塔上编号1至2的盘子(共2个)移动到B塔上(需借助C塔),然后将A塔上的3号最大的盘子移动到C塔,最后将B塔上的两个盘子借助A塔移动到C塔上。...当A塔上有n个盘子是,先将A塔上编号1至n-1的盘子(共n-1个)移动到B塔上(借助C塔),然后将A塔上最大的n号盘子移动到C塔上,最后将B塔上的n-1个盘子借助A塔移动到C塔上。...#include //第一个塔为初始塔,中间的塔为借用塔,最后一个塔为目标塔 int i=1;//记录步数 void move(int n,char from,char to) //...将编号为n的盘子由from移动到to { printf("第%d步:将%d号盘子%c---->%c\n",i++,n,from,to); } void hanoi(int n,char from

35220
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C语言实现汉诺塔

    问题是这样的:古代有一个梵塔,塔内有3个座A,B,C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上。...在移动过程中可以利用C座。要求编程打印出移动的步骤。 其目的是让A中的盘子通过C全部移动到B上面,A为起始,B为终止,C是中转。...其中设计到了递归思想,首先写一段打印代码 void move(char pos1,char pos2) { printf("%c->%c\n",pos1,pos2); } 目的是等下在递归中频繁调用打印操作...Hanoi(n-1,pos1,pos3,pos2); move(pos1,pos2); Hanoi(n-1,pos3,pos2,pos1); } } 这里只针对汉诺塔进行分析...然后最低下的盘子可以从pos1挪到pos2了,就调用move这个函数,当把最底下的盘子挪了之后,就又要将序最底下序号n-1个盘子以pos3为起止,然后以pos1为中转,挪到到pos2目标,依次类推,一个汉诺塔的递归就实现了

    5000

    汉诺塔问题【图文讲解】

    1.问题描述: 汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。...B,char C,int n) { if(n==1) move(A,C); else { han(A,C,B,n-1); move(A,C); han(B,A,C,n-1);...n-1个圆盘从A移到B;然后中间步骤把第n根从A移到C;最后把n-1个从B移到C就可以了; 1个圆盘时: A>>C 2个圆盘时: A>>B A>>C B>>C 3个圆盘时: 第一步:A>>C...A>>B C>>B 第二步:A>>C 第三步:B>>A B>>C A>>C 比较2个圆盘时和3个圆盘的第一步,可以发现:如果把3个圆盘的第一步的C...这是因为2个圆盘的时候,是把2个圆盘从A到C;3个圆盘的第一步是把2两个圆盘从A到B;所以才是han(A,C,B); 而第三部是C盘不变,把2个圆盘从B到C,而不是A到C;所以交换A,B;然后是han(

    15210

    汇编语言、与C语言、实现--汉诺塔--

    题意描述:      用汇编语言实现汉诺塔。只需要显示移盘次序,不必显示所移盘的大小,例如: X>Z,X>Y,Z>Y,X>Z,....。...(n阶Hanoi塔问题)假设有三个分别命名为X、Y、Z的塔座,在塔座X上插有n个直径大小各不相同、依小到大编号为1,2,…,n的圆盘。...汉诺塔的实现,用C语言来解释就是函数递归调用实现 如果转为汇编实现,就直接进入栈进行相应的操作就行(当然你也可以用汇编语言宏实现高级的递归调用..)...C语言方式: void move(char one,char three){ //one 移到thre printf("%c--->%c",one,three); } void HANOI(...} } // end of void HANOI(5,'X','Y','Z'); //即可5阶汉诺塔从X盘移到Z盘 递归操作仔细想想就可以了,这样栈的操作逐渐明朗

    1.7K20

    函数递归 - 汉诺塔(C语言实现)

    思路: 有1个盘子时: 2^1 - 1次 A->C ---- 有2个盘子时: 2^2 - 1次 A->B A->C C->B 有3个盘子时: 2^3 - 1次 A->C A->B C-...>B A->C B->A B->C A->C ---- 3个盘子的简单模拟: ---- ---- 采用递归思想: 初始柱子、目标柱子、中间柱子是相对具体的盘子而言的,但最终所有的盘子均要按规则移动到...C盘之上。...从初始柱子A经过中间柱子C移动到 目标柱子B。 2.对于下面的这1个盘子需要移动到C柱子上。 故C柱子此时是目标柱子,B柱子是中间柱子。...故B柱子是这个总体的初始柱子,这个总体最终需要移动到C柱子上,故C柱子此时便是目标柱子,而A柱子是中间柱子。 看做从初始柱子B经过中间柱子A移动到目标柱子C。 ---- 3.

    23410

    汉诺塔问题

    汉诺塔问题   最近面试题遇到过汉诺塔的问题,当时竟然懵逼了,不会了!!大学研究的问题竟然都忘光了,于是抓紧捡起来。然而在网上看了看博客,发现非递归算法还真挺多。下面总结了一下。...2)将第N个盘子移动到C柱。...- 1, a, c, b); // 将当前a柱的n-1个盘子,通过c移动到b 13 System.out.println(a + "-->" + c);//将a柱子上的最大的盘子移动到...c柱 14 move(n - 1, b, a, c); // n-1个移动过来之后b柱成为a柱,这里就变成了n-1个盘子从b移动到c柱。...E.每一层都是以A未开始,以C为结束     F.奇数层规律是A->C,C->B,B->A,依次循环     G.偶数层规律是A->B,B->C,C->A,依次循环   根据上面的特点进行进一步总结得到

    66210

    汉诺塔问题

    /*有n个盘子,都在A上,盘子大小均不等,要求大的在下,小的在上, 有A, B, C三个地方,要求将这n个盘子从A移动到C处,每次只能移动 一个盘子*/ /*思路: 当有两个盘子时,只需将...1个盘子从A移动到B,便可直接将最后一个 盘子移动到C,然后将上一个盘子移动到B,结束任务;依此类推,对于 n个盘子,只需将上面n-1个盘子借助C移动到B,再将第n个盘子移动到...C,最后 将那n-1个盘子借助A移动到C,便可完成任务*/ #include void hannoi(int n, char A, char B, char C) {...if(n == 1) printf("move dish %d from %c to %c\n",n, A, C); else { hannoi(...n - 1, A, C, B); /*将第n个盘子上面n-1个盘子借助C移动到B*/ printf("move dish %d from %c to %c\n",n, A, C);

    55630

    Hanoi(汉诺塔)

    说明: 汉诺塔(河内塔)(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的,河内为越战时北越的首都,即现在的胡志明市;1883年法国数学家 Edouard...Lucas曾提及这个故事,据说创世纪时Benares有一座波罗教塔,是由三支钻石棒(Pag)所支撑,开始时神在第一根棒上放置64个由上至下依由小 至大排列的金盘(Disc),并命令僧侣将所有的金盘从第一根石棒移至第三根石棒...,且搬运过程中遵守大盘子在小盘子之下的原则,若每日仅搬一个盘子,则当 盘子全数搬运完毕之时,此塔将毁损,而也就是世界末日来临之时。..." to " C);         HANOI(n-1, B, A, C);      }     } C: #include void hanoi(int n, char A, ...char B, char C)  {     if(n == 1)      {         printf("Move sheet %d from %c to %c\n", n, A, C);

    97020

    汉罗塔递归c_递归实现汉诺塔问题

    思路 因为要将 A 柱上的圆盘全部转移到 C 柱上,所以先将最下面的最大的圆盘转移到 C 柱,将上面所有的圆盘看成一个整体,那么将这个整体转移到 B 柱上就可以将最大的圆盘转移到 C 柱了。...然后,将现在 B 柱上最大的圆盘转移到 C 盘上需要借助 A 盘。重复上面的步骤,利用递归的思想。...); } } package Recursion; public class _05_Tower { // num 表示要移动的个数, a,b,c 分别表示A塔, B塔,C塔 public void..."->" + c); }else{ //如果有多个盘,可以看成两个,最下面的和上面的所有盘 //(1)先移动上面所有的盘到 b,借助 c move(num - 1, a, c, b); //(2)...把最下面的的这个盘,移动到 c System.out.println(a + "->" + c); //(3)再把 b塔的所有盘,移动到c , 借助a move(num - 1, b, a, c); }

    34430

    汉诺塔问题

    汉诺塔问题 学递归,跳不过汉诺塔这个程序。以前弄NOIP,老师很详细地讲过汉诺塔的原理以及实现算法,不过我上大学了却发现老师讲到汉诺塔,只是像一笔带过,原理都没讲通,更别说算法了。...我相信像他那么讲,没一个同学(没基础的)能弄得懂,就算你给一个flash汉诺塔的游戏,也不见得会玩。 汉诺塔真的挺有意思的,我写这篇文章,也算是回忆回忆以前学过的知识。如果有什么错误,还请原谅。...没有听说过汉诺塔的人,可以去baidu查查,或则你去http://www.4399.com/flash/293.htm 玩一玩,大概就知道是干什么的了。...这么写:hanota(n,x,y,z); 于是我们上面的三步可以用程序语言来表达: hanota(n-1,A,C,B); hanota(1,A,B,C); hanota(n-1,B,A,C); 这是三个盘子时候的情况...最后给大家和我自己留一个问题:汉诺塔是三根柱子,如果我们有四根柱子,我们又怎样移动盘子,或者说怎样移动使步数最少?有时间我会想想这个问题,以后写一个“汉诺塔拓展”。

    1.2K21
    领券