汉诺塔c++程序

合集下载

汉诺塔c源程序实现及讲解

汉诺塔c源程序实现及讲解

• 3操作指南:在挂有圆盘的柱子上方点击 向上按钮‘ W ’ 或者‘ UPDOWN’按键 选中圆盘,按左右移动键移动到相对应 的柱子上方,按向下键放下圆盘,至此 完成一次圆盘移动。
二、设计思路及程序设计流程
• 1 设计思路:本设计中将盘子的数目设 定为3~9个。设三个柱子A、B、C 移动的过程可分解为三个步骤: 第一步 把A上的n-1个圆盘移到B上; 第二步 把A上的一个圆盘移到C上; 第三步 把B上的n-1个圆盘移到C上; 其中第一步和第三步是类同的。 其实际思想是利用一个递归原理。
• • • • • • • • • • • • • • • • • • •
• • • • • • • • • • • • • • • • • • • • • • •
void Start_Logo()/*启动标志*/ { F(3,8); B(200,150,439,259); S(7); R(201,151,442,262); S(WHITE); R(199,149,440,260); settextstyle(DEFAULT_FONT,HORIZ_DI R,2); O(233,180,"HANOI TOWER"); S(1); O(232,179,"HANOI TOWER");
• • • • • • • • • • • • • • • • • • • • • • • • • • • • •
void ShowInfo(int nRn,int nWhetherGetDisk) { F(1,8); B(230,418,620,428); settextstyle(DEFAULT_FONT,HORIZ_DIR,1); S(CYAN); if(nRn==0&&nWhetherGetDisk==0) O(235,419,"YOU NOW AT THE FIRST ROD"); else if(nRn==1&&nWhetherGetDisk==0) O(235,419,"YOU NOW AT THE SECOND ROD"); else if(nRn==2&&nWhetherGetDisk==0) O(235,419,"YOU NOW AT THE THIRD ROD"); else if(nWhetherGetDisk==1) {S(YELLOW); switch(nRn) {case 0 :O(235,419,"YOU GET THE TOP DISK AT THE FIRST ROD");break; case 1 :O(235,419,"YOU GET THE TOP DISK AT THE SECOND ROD");break; case 2 :O(235,419,"YOU GET THE TOP DISK AT THE THIRD ROD");break; default:break; } } else if(nRn==3&&nWhetherGetDisk==nBaseNum) {S(WHITE);O(235,419,"YOU SHOULD DO YOUR BEST");} else if(nRn==3&&nWhetherGetDisk==nBaseNum*2) O(235,419,"YOU SEEMS PLAY NOT VERY GOOD...^_^"); else if(nRn==4&&nWhetherGetDisk==0) {S(13);O(235,419,"O.K YOU HAVE FINISHED YOURWORK");sleep(1);} else O(235,419,"YOU HAVE GET DOWN THE DISK"); }

c汉诺塔问题递归算法

c汉诺塔问题递归算法

c汉诺塔问题递归算法
汉诺塔问题是一个经典的递归问题,它可以通过递归算法来求解。

下面是汉诺塔问题的递归算法:
cCopycodevoidhanoi(intn,charA,charB,charC){//将n个盘子从A 经由B移动到
Cif(n==1){printf("Movedisk1from%cto%c\n",A,C);}else{hanoi(n -1,A,C,B);//将n-1个盘子从A经由C移动到
Bprintf("Movedisk%dfrom%cto%c\n",n,A,C);hanoi(n-1,B,A,C);//将n-1个盘子从B经由A移动到C}}上述算法中,hanoi函数接受四个参数,其中n表示盘子的数量,A、B、C分别表示三根柱子,其中A是起始柱子,B是中间柱子,C是目标柱子。

如果n=1,则直接将第一个盘子从A移动到C。

如果n1,则将n个盘子从A经由C移动到B,然后将第n个盘子从A移动到C,最后将n个盘子从B经由A移动到C。

这样递归调用,直到n=1的时候,递归结束。

C语言用递归法实现汉诺塔

C语言用递归法实现汉诺塔

C语⾔⽤递归法实现汉诺塔
算法思想:(1)将A上的m-1个盘借助C移到B上
(2)将A上的最后⼀个⼤盘移到C上
(3)将B上的m-1个盘通过A移到C上
基于以上思想可以采⽤递归⽅法,将设需要移动n个盘,则总共需要移动2n-1次。

代码如下:
1 #include<stdio.h>
2void hanoi(int m,char one,char two,char three)
3 {
4void move(char,char); //定义move函数
5if(m==1) //当m为1时直接将盘⼦从A移到C
6 move(one,three);
7else//递归执⾏
8 {
9 hanoi(m-1,one,three,two);
10 move(one,three);
11 hanoi(m-1,two,one,three);
12 }
13 }
14void move(char x,char y) //⽤于展⽰执⾏过程
15 {
16 printf("%c-->%c\n",x,y);
17 }
18int main()
19 {
20int m;
21char A,B,C;
22 printf("请输⼊盘⼦数⽬:");
23 scanf("%d",&m);
24 hanoi(m,'A','B','C');
25 }
运⾏结果如下
注意:因为移动次数是2的n次幂,所以每增加⼀个移动次数就会成倍增加,所以不要输⼊太⼤的数,不然系统执⾏时间变长。

动态汉诺塔c课程设计

动态汉诺塔c课程设计

动态汉诺塔c 课程设计一、课程目标知识目标:1. 理解动态汉诺塔问题的基本原理,掌握汉诺塔问题的递归算法;2. 学会运用程序设计思想解决实际问题,能够编写出动态汉诺塔的解决方案;3. 了解计算机科学中递归算法的应用场景,理解递归算法的优势和局限。

技能目标:1. 能够运用所学知识,独立设计并实现动态汉诺塔的程序;2. 培养逻辑思维能力,提高分析问题和解决问题的能力;3. 提升团队协作能力,通过小组讨论和分享,共同优化解决方案。

情感态度价值观目标:1. 培养对计算机科学的兴趣和热情,激发学习编程的积极性;2. 培养勇于尝试、不断探索的精神,面对困难时保持积极态度;3. 树立正确的价值观,认识到团队合作的重要性,尊重他人意见,共同为解决问题贡献力量。

课程性质:本课程为信息技术学科的教学内容,以实践为主,结合理论讲解,培养学生的编程能力和逻辑思维能力。

学生特点:学生具备一定的编程基础,对汉诺塔问题有一定了解,但可能对动态汉诺塔问题尚陌生,需要通过实践和讨论来提高。

教学要求:教师需注重理论与实践相结合,关注学生的个体差异,引导学生主动探究,提高学生的编程能力和团队合作能力。

通过课程目标的实现,使学生在知识、技能和情感态度价值观方面取得具体的学习成果。

二、教学内容本课程依据课程目标,结合教材内容,组织以下教学大纲:1. 汉诺塔问题引入:回顾汉诺塔的基本原理,引导学生思考如何用程序解决汉诺塔问题。

- 教材章节:第二章 递归算法2. 动态汉诺塔问题分析:讲解动态汉诺塔问题的特点,分析递归算法在动态汉诺塔问题中的应用。

- 教材章节:第二章 递归算法3. 编程实践:指导学生编写动态汉诺塔的程序,实现递归算法。

- 教材章节:第三章 程序设计4. 小组讨论与优化:分组讨论,分享编程心得,优化动态汉诺塔解决方案。

- 教材章节:第四章 算法优化5. 算法分析与拓展:分析动态汉诺塔算法的时间复杂度和空间复杂度,探讨算法的优化方向。

c语言 递归函数实现 汉诺塔

c语言 递归函数实现 汉诺塔

c语言递归函数实现汉诺塔
汉诺塔是一种著名的数学问题,也是经典的递归算法题目。

它包含三个塔座和一些圆盘,盘子大小不一,大的在下面,小的在上面。

开始时,所有的盘子都放在第一个塔座上,要把它们从第一个塔座移动到第三个塔座上,移动时要遵循以下规则:
1.每次只能移动一个盘子;
2.大盘子不能放在小盘子上面。

递归算法是实现汉诺塔问题的最简单方法。

在递归函数中,把整个问题分解成子问题,直至问题规模为1时,直接解决。

下面是C语言实现汉诺塔问题的递归函数:
void hanoi(int n, char A, char B, char C) {
if (n == 1) {
printf('%c -> %c
', A, C);
return;
}
hanoi(n-1, A, C, B);
printf('%c -> %c
', A, C);
hanoi(n-1, B, A, C);
}
函数参数说明:
n:当前塔座上的盘子数量;
A, B, C:三个塔座的名称。

函数实现说明:
1.当塔座上只有一个盘子时,直接将其从A塔座移动到C塔座上;
2.当塔座上有n个盘子时,首先将A塔座上的n-1个盘子移动到B塔座上,然后将A塔座上的一个盘子移动到C塔座上,最后将B塔座上的n-1个盘子移动到C塔座上。

通过递归调用hanoi函数,就能够解决汉诺塔问题。

汉诺塔(C语言)

汉诺塔(C语言)
//加速按钮
bar(160, 540, 240, 580);
setfont(30, 0, "黑体");
++s[0].top;//进栈
for (int i1 = 0; i1 < 4; i1++)
{
p[i]->a[i1] = ta[i1];
s[0].stack[s[0].top] = p[i];//记录每个矩形的位置,top为圆盘的个数
}
}
Hannoi(n, 'a', 'b', 'c');//汉诺塔递归函数
//绘制运动画面的的环境
setcolor(RED);
//三根红色线段作为钢针
line(400, 110, 400, 500);
line(600, 110, 600, 500);
line(200, 110, 200, 500);
//长方体形的底座
setfillstyle(LIGHTGRAY);
bar3d(80, 500, 720, 510, 10, true);
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#define MAX 64//圆盘的最大数目
#define NULL 0
//定义栈
struct STKNODE
{
int a[4];
};
struct STK
{
STKNODE*stack[MAX];
inttop;
};
//定义全局变量
STK s[3];//声明三个栈,分别代表一号二号三号钢针上圆盘的状态

c语言递归汉诺塔每一步详解

c语言递归汉诺塔每一步详解

递归汉诺塔是一个经典的递归问题,它要求将一堆圆盘从一根柱子移动到另一根柱子上,且规定不能通过其他圆盘。

这个问题可以通过递归算法来解决。

在每一步中,我们可以选择将当前最大的圆盘从起始柱子移动到目标柱子,或者将两个较小的圆盘移动到另一个柱子上。

递归函数需要考虑三个柱子的状态:起始柱子、目标柱子和柱子。

在函数中,我们需要判断当前情况是否可以进行移动,如果可以,则执行相应的移动操作,否则返回上一个递归函数继续执行。

最终,当所有圆盘都移到目标柱子上时,问题得到解决。

汉诺塔问题c语言实现

汉诺塔问题c语言实现

汉诺塔问题c语言实现
汉诺塔问题是一道经典的递归问题,它涉及到将若干个不同大小的圆盘,按照一定规则移动到另一个柱子上的问题。

这个问题可以用C语言进行实现。

首先,我们需要定义汉诺塔问题的三个柱子,并初始化三个柱子上的圆盘。

然后,我们可以编写一个递归函数,用来移动圆盘。

该函数的参数包括当前所在的柱子、目标柱子以及要移动的圆盘数量。

在函数内部,我们可以先将除要移动的圆盘外的其余圆盘,从当前柱子移动到中间柱子上。

然后,将要移动的圆盘从当前柱子移动到目标柱子上。

最后,将中间柱子上的其余圆盘,从中间柱子移动到目标柱子上。

递归的结束条件是只要有一个圆盘需要移动,就直接将其从当前柱子移动到目标柱子上即可。

- 1 -。

c语言 递归函数实现 汉诺塔

c语言 递归函数实现 汉诺塔

c语言递归函数实现汉诺塔汉诺塔,也叫河内塔,是国际上广为流传的智力游戏,大约在1200年前就有了。

一座铜塔,塔内共有三个座,最左侧座上有64个从小到大依次排列的盘子,如何把这些盘子全部移到最右侧的底座,移动过程中,需要满足以下三个条件:一次只能移动一个盘子,任何时刻大盘子都必须在小盘子上方,且不能从底座间途中取出已经放好的盘子。

而递归函数则是实现这一问题常用的一种方法。

一、分析问题将n个盘子从A柱移动到C柱,可以分成三个步骤:1、把A柱上的n-1个盘子移动到B柱上;2、把A柱上最后一个盘子(即最大的盘子)移动到C柱上;3、把B柱上的n-1个盘子移动到C柱上。

如此递归下去,直到只有一个盘子需要移动的时候,就可以进行移动了。

二、实现递归函数根据上述分析,可以写出递归函数如下:void hanoi(int n, char A, char B, char C){if(n == 1){printf("Move disk %d from %c to %c \n", n , A, C);}else{hanoi(n-1, A, C, B); //把A柱上的n-1个盘子移动到B柱上printf("Move disk %d from %c to %c \n", n , A, C); //把A 柱上的最大盘子移到C柱上hanoi(n-1, B, A, C); //把B柱上的n-1个盘子移动到C柱上}}三、调用递归函数在主函数中调用递归函数,可以输入盘子的个数n和底部柱的名称A、B、C,并执行hanoi函数:int main(){int n;printf("Please enter the number of disks: ");scanf("%d", &n);hanoi(n, 'A', 'B', 'C');return 0;}四、运行结果当输入盘子的个数为3时,运行结果如下:Please enter the number of disks: 3Move disk 1 from A to CMove disk 2 from A to BMove disk 1 from C to BMove disk 3 from A to CMove disk 1 from B to AMove disk 2 from B to CMove disk 1 from A to C五、总结通过递归函数实现汉诺塔问题,可以更好地理解递归的概念和实现方式。

汉诺塔移动次数c语言

汉诺塔移动次数c语言

汉诺塔移动次数c语言汉诺塔是一道著名的递归问题,其解法涉及到大量的递归操作。

汉诺塔问题使用c语言实现时,可以利用递归函数来实现。

在实现汉诺塔问题时,需要考虑以下几个方面:1. 汉诺塔问题的定义和规则汉诺塔是一种益智游戏,问题的定义如下:有三个塔,分别命名为A、B、C,其中A塔上有一些盘子,它们的大小不一样。

现在需要将所有的盘子从A塔移动到C塔上,规则如下:1) 每次只能移动一个盘子;2) 盘子不能直接从A塔移到C塔,必须先移动到B塔上,再从B塔移动到C塔上;3) 盘子大小的排列顺序必须保持不变,即大盘子不能放在小盘子的上面。

2. 汉诺塔问题的解法汉诺塔问题的解法可以用递归函数来实现。

在递归函数中,先将n-1个盘子从A塔移动到B塔,然后将第n个盘子从A塔移动到C塔,最后将n-1个盘子从B塔移动到C塔。

递归的结束条件是只有一个盘子需要移动时,直接将它从A塔移动到C塔即可。

以下是汉诺塔问题的c语言代码实现:```c#include <stdio.h>// 汉诺塔移动函数void hanoi(int n, char a, char b, char c, int *count){if (n == 1){(*count)++;printf("第%d次移动,将盘子%d从%c塔移到%c塔\n", *count, n, a, c);}else{hanoi(n - 1, a, c, b, count);(*count)++;printf("第%d次移动,将盘子%d从%c塔移到%c塔\n", *count, n, a, c);hanoi(n - 1, b, a, c, count);}}// 主函数int main(){int n = 3; // 盘子的数量int count = 0; // 移动次数的计数器hanoi(n, 'A', 'B', 'C', &count); // 调用递归函数printf("一共移动了%d次\n", count);return 0;}```3. 汉诺塔问题的移动次数汉诺塔问题的移动次数有一个经典的公式:$2^n-1$(n为盘子的数量)。

c语言汉诺塔编程题试题库及答案

c语言汉诺塔编程题试题库及答案

c语言汉诺塔编程题试题库及答案C语言汉诺塔编程题试题库及答案一、试题1. 请编写一个C语言程序,实现汉诺塔问题的解决方案。

2. 程序需要接受用户输入的盘子数量,然后输出移动盘子的完整步骤。

3. 要求使用递归函数来解决汉诺塔问题。

二、答案```c#include <stdio.h>// 递归函数,用于移动盘子void hanoi(int n, char from_rod, char to_rod, char aux_rod) { if (n == 1) {printf("\n 移动盘子 1 从 %c 到 %c", from_rod, to_rod); return;}hanoi(n - 1, from_rod, aux_rod, to_rod);printf("\n 移动盘子 %d 从 %c 到 %c", n, from_rod, to_rod); hanoi(n - 1, aux_rod, to_rod, from_rod);}// 主函数int main() {int n;printf("输入盘子的数量: ");scanf("%d", &n);// 调用递归函数开始解决汉诺塔问题hanoi(n, 'A', 'C', 'B'); // A为起始柱子,C为目标柱子,B为辅助柱子return 0;}```三、解析1. 程序首先包含了标准输入输出头文件`stdio.h`。

2. `hanoi`函数是一个递归函数,它接受四个参数:盘子数量`n`,起始柱子标识符`from_rod`,目标柱子标识符`to_rod`,以及辅助柱子标识符`aux_rod`。

3. 如果只有一个盘子,直接将其从起始柱子移动到目标柱子。

4. 如果有多于一个盘子,先将上面的`n-1`个盘子从起始柱子借助目标柱子移动到辅助柱子。

汉诺塔递归算法c++语言

汉诺塔递归算法c++语言

汉诺塔递归算法c++语言一、算法概述汉诺塔问题是经典的递归问题,涉及到移动物体的操作和递归解决问题的策略。

通过使用C语言编写汉诺塔递归算法,我们可以更深入地理解递归思维和解决复杂问题的技巧。

二、算法描述汉诺塔问题的基本描述如下:有n个大小不一、重量不同、用不同材质制成的盘子,将它们从A柱移动到C柱,每次只能移动一个盘子,且每次移动的盘子必须放在比它小的柱子上。

汉诺塔递归算法的核心思想是将复杂问题分解为更小的子问题,直到达到基本情况(即无子问题需要解决),然后通过递归调用返回基本情况的结果,从而解决原始问题。

三、C语言实现以下是用C语言实现汉诺塔递归算法的代码:```c#include<stdio.h>voidhanoi(intn,charfrom,chartemp,charto){if(n==1){printf("Movedisk1from%cto%c\n",from,to);}else{//将n-1个盘子从from柱移动到temp柱,将最大的盘子从from柱移动到to柱hanoi(n-1,from,to,to);//递归调用,解决子问题//将最大的盘子从temp柱移动到to柱printf("Movedisk%dfrom%cto%c\n",n,from,to);//将n-1个盘子从to柱移动到temp柱,以便于将最大的盘子移动到to柱hanoi(n-1,temp,from,to);//递归调用,解决子问题){}}intmain(){intn=3;//盘子数量,可以根据需要修改hanoi(n,'A','B','C');//调用函数,将盘子从A柱移动到C柱return0;}```四、总结与思考通过使用C语言实现汉诺塔递归算法,我们可以更深入地理解递归思维和解决复杂问题的技巧。

在实际应用中,递归算法通常适用于那些可以分解为更小子问题的情况,通过逐个解决子问题,最终达到解决原始问题的目的。

c语言汉诺塔课程设计

c语言汉诺塔课程设计

c语言汉诺塔课程设计一、课程目标知识目标:1. 学生理解汉诺塔问题的起源、规则及数学原理;2. 学生掌握利用C语言实现汉诺塔问题的递归算法;3. 学生了解递归算法在解决汉诺塔问题中的优势及局限性;4. 学生理解程序中的变量、函数和参数在汉诺塔问题中的作用。

技能目标:1. 学生能够运用C语言编写递归函数解决汉诺塔问题;2. 学生通过编程实践,培养逻辑思维和问题分析能力;3. 学生能够运用所学知识,解决类似汉诺塔的其他递归问题;4. 学生具备调试和优化程序的能力,提高代码质量。

情感态度价值观目标:1. 学生培养对计算机编程的兴趣和热情,激发探究精神;2. 学生通过团队协作解决问题,培养合作精神和沟通能力;3. 学生在面对编程难题时,保持积极的心态,勇于克服困难;4. 学生认识到编程在解决实际问题中的价值,增强社会责任感。

分析课程性质、学生特点和教学要求,本课程旨在帮助学生在掌握C语言基础知识的基础上,通过汉诺塔问题的实践,提高编程能力、逻辑思维和问题解决能力。

课程目标具体、可衡量,为后续的教学设计和评估提供明确方向。

二、教学内容1. 汉诺塔问题背景介绍:包括汉诺塔问题的起源、发展及数学原理;2. C语言递归算法基础:回顾C语言中函数的定义、调用和递归概念;3. 汉诺塔问题递归算法设计:详细讲解如何使用C语言实现汉诺塔递归算法;- 算法思路分析- 代码编写与调试- 递归算法优化4. 实践环节:安排学生动手实践,编写汉诺塔递归程序,并调试优化;- 分组讨论与协作- 代码分享与评价- 问题解答与指导5. 拓展延伸:引导学生思考汉诺塔问题的其他解法,如非递归算法等;- 相关算法介绍- 学生自主探究- 课堂讨论与总结教学内容依据课程目标,结合教材相关章节,保证科学性和系统性。

教学大纲明确教学内容的安排和进度,旨在帮助学生系统地掌握汉诺塔问题的递归算法,并培养实际编程能力。

三、教学方法本课程采用以下多样化的教学方法,以激发学生的学习兴趣和主动性:1. 讲授法:教师通过讲解汉诺塔问题的背景知识、递归算法原理及C语言编程技巧,为学生奠定理论基础。

c语言递归解决汉诺塔问题

c语言递归解决汉诺塔问题

c语⾔递归解决汉诺塔问题汉诺塔(Hanoi)是必须⽤递归⽅法才能解决的经典问题。

上帝创造世界时作了三根⾦刚⽯柱⼦,在第⼀根柱⼦上从下往上按⼤⼩顺序摞着64⽚黄⾦圆盘,上帝命令婆罗门把圆盘从下⾯开始按⼤⼩顺序重新摆放到第⼆根柱⼦上,并且规定,每次只能移动⼀个圆盘,在⼩圆盘上不能放⼤圆盘。

(即借助C把A上的圆盘移到B,并且从上到下圆盘增⼤)#include<stdio.h>void Hanoi(int n, char A, char B, char C){if (n == 1) #如果只有⼀个直接从A移到B{printf("Move %d: from %c to %c\n",n,A,B);}else{Hanoi(n - 1, A, C, B); #把n-1个从A移到C借助Bprintf("Move %d: from %c to %c\n",n,A,B);Hanoi(n - 1, C, B, A); #把n-1个从C移到B借助A}}int main(){int n;char A = 'A';#定义ABC表⽰三个柱⼦char B = 'B';char C = 'C';printf("Input the number of disks:");scanf("%d", &n);printf("Steps of moving 3 disks from A to B by means of C:\n");Hanoi(n, A, B, C);return 0;}/*根据上⾯的原理增加⼀个计数器,并将步骤打印出来*/#include<stdio.h>int i = 1;//定义全局变量,每次调⽤后加1void Hanoi(int n, char A, char B, char C){if (n == 1)//如果只有⼀个直接从A移到B "%2d-(%2d):%c==>%c\n"{printf("%2d-(%2d):%c==>%c\n",i++,n,A,B);}else{Hanoi(n - 1, A, C, B);//把n - 1个从A移到C借助Bprintf("%2d-(%2d):%c==>%c\n", i++, n, A, B);Hanoi(n - 1, C, B, A);//把n - 1个从C移到B借助B}}int main(){int n;char A = 'A'; //定义ABC表⽰三个柱⼦char B = 'B';char C = 'C';printf("Please enter the number of discs:");scanf("%d", &n);Hanoi(n, A, B, C);printf("\tTotal:%d\n",--i); return 0;}。

汉诺塔c语言讲解

汉诺塔c语言讲解

汉诺塔c语言讲解
汉诺塔是一种经典的数学逻辑游戏,同时也是计算机科学中经典的递归算法示例之一。

在汉诺塔游戏中,我们有三个柱子,最初第一个柱子上排列着n个圆盘,它们呈金字塔形状。

我们的任务是把这些盘子一个一个地从第一个柱子移到第三个柱子上,同时保持它们原来的顺序。

C语言是一种流行的编程语言,它可以用来实现各种算法和游戏。

用C语言实现汉诺塔游戏就非常简单。

我们可以将汉诺塔的规则抽象为下面这段C语言代码:
void hanoi(int n, char a, char b, char c)
{
if (n == 1) {
printf("%c to %c\n", a, c);
} else {
hanoi(n-1, a, c, b);
printf("%c to %c\n", a, c);
hanoi(n-1, b, a, c);
}
}
这个函数接受四个参数,分别是表示盘子数目的n,以及三个柱子的标识符a、b和c。

它通过递归实现将n个盘子从a柱子移动到c柱子的过程。

每次调用hanoi()函数时,它都会将一个盘子从a柱子上取下,然后递归地将n-1个盘子从a移到b柱子上,最后将那个盘子从a 移到c柱子上。

这个算法非常简洁和优美,同时也能展示出递归算法的良好性质。

总之,用C语言实现汉诺塔游戏是一种非常有趣和有益的编程练习,可以提高我们的编程能力和算法思维水平。

汉诺塔问题非递归算法c语言

汉诺塔问题非递归算法c语言

汉诺塔问题非递归算法c语言以下是一个非递归解决汉诺塔问题的C语言算法:```c#include <stdio.h>// 定义栈的数据结构typedef struct {int n; // 当前圆盘数char src, dst, aux; // 源柱子、目标柱子和辅助柱子 int step; // 当前操作数} Stack;void hanoi(int n) {Stack s[32]; // 栈,存储每一步的操作int top = 0; // 栈顶指针int i; // 循环变量char tmp; // 用于交换柱子s[top].n = n;s[top].src = 'A';s[top].dst = 'C';s[top].aux = 'B';s[top].step = 0;while (top >= 0) {// 出栈n = s[top].n;char src = s[top].src;char dst = s[top].dst;char aux = s[top].aux;int step = s[top].step;top--;if (n == 1) {printf("第%d步:将第1个盘从 %c 柱移到 %c 柱\n", step+1, src, dst);} else if (step == 0) {// 第一步:将上面 n-1 个盘从源柱借助辅助柱移到辅助柱s[++top].n = n - 1;s[top].src = src;s[top].dst = aux;s[top].aux = dst;s[top].step = 0;} else if (step == 1) {// 第二步:将第 n 个盘从源柱移到目标柱printf("第%d步:将第%d个盘从 %c 柱移到 %c 柱\n", step+1, n, src, dst);} else if (step == 2) {// 第三步:将上面 n-1 个盘从辅助柱借助目标柱移到目标柱s[++top].n = n - 1;s[top].src = aux;s[top].dst = dst;s[top].aux = src;s[top].step = 0;} else {// 交换辅助柱和目标柱tmp = aux;aux = dst;dst = tmp;// 第一步:将上面 n-1 个盘从源柱借助辅助柱移到辅助柱s[++top].n = n - 1;s[top].src = src;s[top].dst = aux;s[top].aux = dst;s[top].step = 0;}// 当前步骤加1s[top].step++;}}int main() {int n;printf("请输入汉诺塔的盘数:");scanf("%d", &n);hanoi(n);return 0;}```使用栈来模拟递归过程,将递归过程中的参数和局部变量保存到栈中,依次出栈执行,直到栈为空。

汉诺塔递归算法详细解析(C语言版)

汉诺塔递归算法详细解析(C语言版)

汉诺塔递归算法详细解析(C语⾔版)汉诺塔代码:1// 汉诺塔2 # include <stdio.h>3void hanoi ( int n, char a, char b, char c ) //这⾥代表将a柱⼦上的盘⼦借助b柱⼦移动到c柱⼦4 { if (1 == n) //如果是⼀个盘⼦直接将a柱⼦上的盘⼦移动到c5 {6 printf("%c-->%c\n",a,c);7 }8else9 {10 hanoi ( n-1, a, c, b ) ; //将a柱⼦上n-1个盘⼦借助c柱⼦,移动到b柱⼦11 printf("%c-->%c\n",a , c) ; //再直接将a柱⼦上的最后⼀个盘⼦移动到c12 hanoi ( n-1, b, a, c ) ; //然后将b柱⼦上的n-1个盘⼦借助a移动到c13 }14 }15int main ()16 { int n ;17 printf( "Input the number of diskes:") ;18 scanf("%d",&n) ;19 hanoi ( n, 'A' , 'B' , 'C' ) ;20return0;21 }算法分析:(步骤1) 如果是⼀个盘⼦ 直接将a柱⼦上的盘⼦从a移动到c 否则(步骤2) 先将a柱⼦上的n-1个盘⼦借助c移动到b(图1), 肯定没有c柱⼦是不能移动的,已知函数形参是hanoi(int n,char a,char b,char c)。

代表将a柱⼦上的盘⼦借助c柱⼦移动到b柱⼦,这⾥调⽤函数的时候是将a柱⼦上的n-1个 盘⼦借助c柱⼦,移动到b柱⼦。

所以这⾥需要将位置调换⼀下hanoi(n-1,a,c,b)。

(步骤3) 此时移动完如图1,但是还没有移动结束,⾸先要将a柱⼦上的最后⼀个盘⼦(第n个)盘⼦直接移动到c(图2)(步骤4) 最后将b柱⼦上的n-1个盘⼦借助a移动到c(图3)这样递归算法就完成了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if (platesCount == 1) {
listSavedState.push_back(platesCount); listSavedState.push_back(source); listSavedState.push_back(destination); listSavedState.push_back(intermediate); return ; } else {
Hanoi(platesCount -1, from, by, dest); Hanoi(1, from, dest, by); Hanoi(platesCount -1, by, dest, from); } } // Advance one step to solve Hanoivoid HanoiDrawer::SolveNextStep() { int platesCount , source , destination , intermediate;
Hanoi(platesCount - 1, source, intermediate, destination); Hanoi(1, source, destination, intermediate); Hanoi(platesCount - 1, intermediate, destination, source); return ; } }
if (listSavedState.size()==0) {
this->Hanoi(this->iPlatesCount, HanoiDrawer::SOURCE , HanoiDrawer::DESTINATION,
HanoiDrawer::INTERMEDIATE); }
if(listSavedState.size() % 4 != 0 ) {
SetDlgItemText(this->hWnd, this->toContainerResourceId , PlaceIntToString(destination).c_str() );
SetDlgItemText(this->hWnd, this->throughContainerResourceId , PlaceIntቤተ መጻሕፍቲ ባይዱoString(intermediate).c_str() );
this->solved = true; }
SetDlgItemInt(this->hWnd, this->countContainerResourceId, GetMovesCount(), FALSE);
SetDlgItemText(this->hWnd, this->fromContainerResourceId, PlaceIntToString(source).c_str() );
void Hanoi(int platesCount, int from, int dest, int by) {
if (platesCount==1) {
printf( "Move the plate from %d to %d through %d" , from, dest, by);
} else {
} // Draws stands and plates// then do Invalidate// this operation is required// in each stepvoid HanoiDrawer::ReDraw() {
DrawStands();
DrawPlates();
Invalidate(); } // The internal function that is responsible// about solve the problem.// platesCount : how many plates// source : the index of the source// destination : the index of the destination// intermediate : the index of the intermediatevoid HanoiDrawer::Hanoi(int platesCount, int source, int destination, int intermediate) {
intermediate = listSavedState.front(); listSavedState.pop_front();
MovePlateFromTo(source, destination);
this - > iMovesCount++;
if(iMovesCount == this->GetTotalMovesCount()) {
return ; }
platesCount = listSavedState.front(); listSavedState.pop_front();
source = listSavedState.front(); listSavedState.pop_front();
destination = listSavedState.front(); listSavedState.pop_front();
相关文档
最新文档