汉诺塔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 -。

  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();
相关文档
最新文档