汉诺塔演示

汉诺塔演示
汉诺塔演示

汉诺塔演示

课程设计报告

姓名学号分工

胡楠楠201212201401027组长统筹规划梅清晨201212201401009报告、部分代码刘安妮201212201401029报告、部分代码孙坡坡201212201402010PPT演示

目录

一、问题描述.................................................................................................................................. II

二、任务概述.................................................................................................................................. II

2.1课程设计的目的............................................................................................................... II

2.2课程设计的内容和要求................................................................................................... II

2.2.1功能要求.............................................................................................................. II

2.2.2环境要求............................................................................................................. I II

2.2.3课程设计设备..................................................................................................... I II

三、问题分析:............................................................................................................................. I II

四、设计思路.................................................................................................................................. V

4.1主程序流程图................................................................................................................... V

4.2功能模块示意图.............................................................................................................. V I

4.3汉诺塔求解流程图.......................................................................................................... V I

五、模块详细说明....................................................................................................................... VII

5.1背景初始化.................................................................................................................... VII

5.1.1开启DOS图形模式......................................................................................... VII

5.1.2字幕显示模块...................................................................................................... VII

5.2问题求解模块................................................................................................................... I X

5.2.1汉诺塔问题描述.................................................................................................... I X

5.2.2移动方案................................................................................................................. X

5.2.3演示动画................................................................................................................. X

5.2.4屏幕暂停函数........................................................................ 错误!未定义书签。

5.2.5路径清理模块...................................................................................................... XII

六、用户运行界面图示............................................................................................................... XII

七、心得体会........................................................................................................................ X VI

一、问题描述

汉诺塔问题源于印度古老的一个传说。相传开天辟地的神勃拉玛创造世界时在印度北部的佛教圣地的圣庙里,安放了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。值班僧侣按照法则日夜不停地搬运,当搬运完成时世界将在一声霹雳中毁灭。

传说固然只是传说,这个古老的故事到今天又引申出一连串的包括统筹、管理等等数学问题。在现实生活中,任何一个人都不可能直接写出移动盘子的每一个具体步骤。比较经典的使用递归算法也是在这方面做了大量研究得出的一种相对优化的算法方案。

整个程序采用了自顶向下,逐步细化的设计方法。主要分为三个模块:图形环境初始化、问题求解、以及过程动画演示。程序能够处理用户输入的不同初始值使需要搬动的盘子数初始化。初始化图形采用点阵方式直接写屏。

二、任务概述

2.1课程设计的目的

1、通过课程设计,加深对图形学算法设计思想的理解,并掌握用C语言及MFC进行简单的开发和设计.

2、通过算法的设计,学会从具体问题抽象出数学模型,并能够用程序设计语言描述出来,用计算方法来求解

3、学习一些基本的数据结构及算法思想,比如排序以及链表的基本操作在C环境中的实现。

2.2课程设计的内容和要求

2.2.1功能要求

①能够实现按用户需要对输入的不同盘子数量进行处理。

②能够实现根据输入条件,给出完整的解决方案。

③能够显示出每次搬运后的结果。

④能够实现每一个搬运步骤的动画演示。

⑤演示过程中允许用户在任意时刻中断演示。以避免无意义等待。

2.2.2环境要求

①能够在windows操作系统下正常运行。

②具有一定的错误屏蔽功能。

③有友好的界面。

④是用户能接受的简单的操作。

2.2.3课程设计设备

满足下列系统要求,安装Visual Studio C++ 6.0版本的计算机:

处理器:配有Pentium III级处理器 (600 MHz)的PC,建议:1 GHz;

RAM:192 MB,建议:256MB4

可用硬盘空间:

①必需:

基本容量:系统驱动器上需要 75 MB 的可用空间;安装驱动器上需要 330 MB 的可用空间;

②可选:

含 MSDN 速成版:系统驱动器上需要 166 MB 的额外可用空间;安装驱动器上需要 600 MB 的额外可用空间;

操作系统:Windows 2000、Windows XP 或 Windows Server 2003;

CD-ROM 或 DVD-ROM 驱动器:没有要求;

视频:800 x 600,256 色;建议:1024 x 768,增强色 16 位;

鼠标:Microsoft 鼠标或兼容的指针设备。

三、问题分析

对于一个类似的这样的问题,任何一个人都不可能直接写出移动盘子的每一个具体步骤。可以利用这样的统筹管理的办法求解:我们假设把该任务交给一个僧人,为了方便叙述,将他编号为64。僧人自然会这样想:假如有另外一个僧人能有办法将63个盘子从一个座移到另一个座,那么问题就解决了,此时僧人64只需这样做:

A B C

图2.1 汉诺塔

1. 命令僧人63将63个盘子从A 座移到C 座

2. 自己将最底下的最大的一个盘子从A 座移到C 座

3. 再命令僧人63将63个盘子从B 座移到C 座

为了解决将63个盘子从A 座移到B 座的问题,僧人63又想:如果能再有

一个僧人62能将62个盘子移动到另一座,我就能将63个盘子从A 座移动到B 座。他是这样做的:

1. 命令僧人62将62个盘子从A 移动到C

2. 自己将一个盘子从A 座移动到B 座

3. 再命令僧人62将62个盘子移到B 座

再进行一次递归。如此“层层下放”,直到后来找到第2个僧人,让他完成将2个盘子从一个座移到另一个座,进行到此,问题就解决了。最后找到第1个僧人,让他完成将一个盘子从一个座移动到另一个座,至此,全部工作已经完成,都是可以执行的。

按照如此的思路设计递归算法,很容易得出盘子的移动方案。

另外是图形演示盘子的移动过程。为了能够更加形象的表示盘子的移动过程。在设计图形演示的时候,我们采用了图形动态演示。首先我们将字幕、柱子、以及提示信息等等屏幕内容设置成固定不变,我们这里称之为舞台。我们将盘子看作对象,一个盘子一个对象。在设计演示过程的时候,只需要将盘子对象放置于二维界面中的不同信置,通过刷新屏幕,实现动画显示。

四、设计思路

4.1主程序流程图

开始

输入盘子数

初始化过程

绘制初始图形

汉诺塔求解

结束

图2.3 主程序流程图

4.2功能模块示意图

4.3汉诺塔求解流程图

开始

将盘子从A 座移到C 座 n 为1?

递归调用,初始n=n-1

盘子数为n

结束

图2.4 Hanoi 递归过程流程图

退出一级调用n=n+1

汉诺塔图形演示程序

背景初始化

问题求解

图形动画演示

柱子舞台图形 点阵字模字幕

H a n i o 方案

移动传值调用

路径动作演示

路径清理模块

图2.2 功能模块示意图

五、模块详细说明

5.1背景初始化

5.1.1开启DOS图形模式

MFC 提供了非常丰富的图形函数,在该个初始化模块中主要完成图形模式的初始化、独立图形程序的建立、基本图形功能、图形窗口以及图形模式下的文本输出等函数。

另外,使用图形函数时要确保有显示器图形驱动程序*BGI,同时将集成开发环境options/Linker中的Graphics lib选为on,只有这样才能保证正确使用图形函数。

不同的显示器适配器有不同的图形分辨率。即是同一显示器适配器,在不同模式下也有不同分辨率。因此,在屏幕作图之前,必须根据显示器适配器种类将显示器设置成为某种图形模式,在未设置图形模式之前,微机系统默认屏幕为文本模式(80列,25行字符模式),此时所有图形函数均不能工作。设置屏幕为图形模式,可用下列图形初始化函数:

void CHHHoniaView::OnDraw(CDC* pDC)

{

CHHHoniaDoc* pDoc = GetDocument();

ASSERT_V ALID(pDoc);

// TODO: add draw code for native data here

CClientDC dc(this);

CPen pen(PS_DASH,3,RGB(255,0,0));

CPen *pOldPen;

for(int i=0;i<3;i++)

{

pOldPen=dc.SelectObject(&pen);

dc.SetROP2(R2_BLACK);//绘图环境

dc.MoveTo(50+300*i,400);

dc.LineTo(300+300*i,400);

dc.MoveTo(180+300*i,400);

dc.LineTo(180+300*i,100);

}

dc.SelectObject(pOldPen);

}

5.1.2开始演示显示模块

以下是其画出盘子函数的代码:

void CHHHoniaView::DrawDisk(int bian1,int bian2,int bian3)

{

int m;

if (bian1<0)

AA[1]->Delete(m);

else if(bian1>0) AA[1]->Add(bian1);

//

if (bian2<0)

AA[2]->Delete(m);

else if(bian2>0) AA[2]->Add(bian2);

//

if (bian3<0)

AA[3]->Delete(m);

else if(bian3>0) AA[3]->Add(bian3);

RedrawWindow();

CClientDC dc(this);

CBrush Brush1;

Brush1.CreateSolidBrush(RGB(25,70,100));

CBrush pBrush;

CBrush *oldbrush;

for(int rank=1;rank<4;rank++)

{

for (int i=0;ilengh;i++)

{

oldbrush=dc.SelectObject(&pBrush);

/* pDC->Draw3dRect(rect.left, rect.top, rect.Width(), rect.Height(),

RGB(255, 0, 0), RGB(0, 255, 0));*/

dc.Rectangle(CRect(180+300*(rank-1)-(AA[rank]->stack[i])*10,380-i*20, 180+300*(rank-1)+(AA[rank]->stack[i])*10,400-i*20));

dc.FillRect(CRect(180+300*(rank-1)-(AA[rank]->stack[i])*10,380-i*20,180+300*(rank-1)+(AA[rank]->stack[i])*10,400-i*20),&Brush1);

} }

dc.SelectObject(oldbrush); }

5.2问题求解模块

5.2.1汉诺塔问题描述

可以看出,递归调用的结束条件是最后一个步骤只需要移动一个盘子。否则,递归过程还将继续进行下去。只有僧人1的任务完成后,僧人1的任务才能完成。若将问题简化,将两个盘子移动的过程可以这样描述:

1. 将盘子1 移动到B 座

2. 将盘子2移动到C 座

3. 将盘子1从B 座移动到C 座

一共经历了3个步骤,我们可以很容易地推断出,移动N 个盘子需要

12 N 个步骤。编写程序时,用若干个程序实现这个操作,用hanoi 函数实

现编号较大的僧人需要完成的任务。用move()实现编号较小的僧人需要完成的任务。

A B

C

图2.1 汉诺塔

5.2.2移动方案

其中,move()函数实现的过程,是将主调用函数传来的参数为根据,将需要搬走的盘子对应的柱子出栈一个对象操作,然后将对应搬入的柱子入栈相应对象。该对象即为盘子对象,盘子对象由主调用函数带入。

出栈与入栈操作是一次性完成,虽然是由不同的代码段完成,但设计逻辑上认为是一个操作。在程序的流程中,我们还将移动盘子的动画部分在该过程中完成调用。

解决问题代码如下:

void CHHHoniaView::Hanoi::TowersOfHanoi(int n, int x, int y, int z)

{ //把n个碟子从塔x移动到塔y,可借助于塔z

int d; // disk number

if (n > 0) {

TowersOfHanoi(n-1, x, z, y);

S[x]->Delete(d); // remove a disk from x

ARRAY[x]->Add(-1);

S[y]->Add(d); // put this disk on tower y

ARRAY[y]->Add(d);

ARRAY[z]->Add(0);

couts++;

TowersOfHanoi(n-1, z, y, x);

}

}

5.2.3演示动画

此块模块的设计是整个课程设计的重点,也是设计难点。此处的设计不仅仅是对已经有现成答案的问题从程序设计的角度去实现它,而是在设计的过程中提出了新的挑战。

首先,为了实现比较好的视觉效果,设计中制作的动画和一般的不同,平常的动画设计它本身的对象移动路径是固定的,其路径函数可以很容易的表示出来。而我们的柱子栈高度是动态的,当它堆栈的盘子数目不同时,

柱子的高度也不同。另外,每个盘子所移动的路线,幅度都是不一样的。这个问题怎么解决呢?

我们设计一个动态的函数,假设其为一个抛物线。设抛物线函数为:

(Y-b)=p(X-a)2.

在一个时间点内,每个柱子堆栈的高度是一定的,可以根据相应的盘子数目得出。柱子的水平位置在程序设计时也是固定的。将其量化为屏幕上的像素点。可以得出两个函数在屏幕上对应点。

另外,我们可以设计抛物线最高点为固定值,设其值为H。这样,包含有三个参数的曲线函数就可以唯一确定。其推导过程如下:P(x1-a)2= y1-H ①

P(x2-a)2= y2-H ②

由①②可以得到:P = (y2-H)/ (x2-a)2将其代入①中可以得到:

(y1-H)/( y2-H) = (x1-a)2/(x2-a)2

设q = (y1-H)/( y2-H)1/2

此时a=(x1-x2*q)/(1-q)

P=( y2-H)/(x2-a)2

H为固定值。此时,所有参数已经确定,整个方程都可以列出来。每一次盘子移动的路径也可以唯一确定下来。

当move 得到由主调用函数传递来的参数时,每一次被调用都需要重新计算函数参数值,以保证每个演示帧自然呈现。

路径函数为:

Y= P(x-a)2+b. 每刷新一个帧后,须根据x 自变量计算下一帧中盘子对象的Y坐标。

代码实现如下:

void CHHHoniaView::Hanoi::TowersOfHanoiy(int n)

{//预处理程序

couts=0;

S[1] = new Stack(n);

S[2] = new Stack(n);

S[3] = new Stack(n);

ARRAY[1]=new Stack(pow(2,n)-1);

ARRAY[2]=new Stack(pow(2,n)-1);

ARRAY[3]=new Stack(pow(2,n)-1);

for (int d = n; d > 0; d--) // initialize

S[1]->Add(d); // add disk d to tower 1

TowersOfHanoi(n, 1, 2, 3);

}

演示结束函数:

void CHHHoniaView::OnBottomZhidon()

{

// TODO: Add your command handler code here

do {

DrawDisk(HAN.ARRAY[1]->stack[next],HAN.ARRAY[2]->stack[nex t],HAN.ARRAY[3]->stack[next]);

Sleep(m_sleep);

next++;

} while(next

MessageBox("finish");

}

5.24路径清理模块

在实现了动画的移动过程后,如果想重新开始下一轮的汉诺塔演示,依然要重新初始化开始,代码如下。

void CHHHoniaView::OnExitBegin()

{

// TODO: Add your command handler code here

UpdateData();

CTower dlg;

if(dlg.DoModal()==IDOK)

{

m_nDisk=dlg.m_nDisk;

m_sleep=dlg.m_sleep;

next=0;

// m_nSteps=dlg.m_bStep;

}

}

void CHHHoniaView::OnExitNext()

{

// TODO: Add your command handler code here

if(next

DrawDisk(HAN.ARRAY[1]->stack[next],HAN.ARRAY[2]->stack[next] ,HAN.ARRAY[3]->stack[next]);

else MessageBox("finish");

next++;

}

void CHHHoniaView::OnExitStart()

{

// TODO: Add your command handler code here

HAN.TowersOfHanoiy(m_nDisk);

AA[1] = new Stack(m_nDisk);

AA[2] = new Stack(m_nDisk);

AA[3] = new Stack(m_nDisk);

for (int d = m_nDisk; d >0; d--) // initialize

AA[1]->Add(d);

DrawDisk(0,0,0);

}

六、用户运行界面图示背景初始化

输入汉诺塔的初始值,如下图所示:

点击ok之后恢复之后,点击开始之后出现汉诺塔的塔形,如下图所示:

演示结果之后结束展示如下图所示:

在图形界面中,每一个盘子的移动过程都会以设计好的速度演示出来。用户可以根据屏幕的提示,跟着演示动画实际操作。当用户需要中断演示动画时,只

需要按键盘上任意键即可。至此,整个设计完全设计完成,达到设计要求。

七、心得体会

通过这个课程设计题目,并且我们选择了一个对我们来讲相当富有挑战性的题目,这更使我认识到,仅仅是学会书面知识是不行的,一方面,对程序设计语言本身的理解不够透彻,另一方面,由于对数据结构及常用算法的理解上的欠缺,再加上我自己在这方面的练习相当少,这些都不同程度地添加了完成这个题目的困难度。

要做算法的设计首先是对程序设计语言的相当的熟悉,而且能够实际熟练地运用,要能够把自己的想法,转换为由程序设计语言来表达。这就要求自己不仅仅要会解决实际问题,而且要有能够将实际问题抽象化,数学建模,以及能用计算机程序设计语言来表达实现。这对我们的程序设计水平和对程序语言代码的敏感度以及专业修养是一个很好的挑战。

其次,算法设计的要求也不仅仅是程序设计语言,前面讲到了由实际具体问题抽象建模,由于计算机内部是由二进制来表示和存储数据,程序设计语言实现了计算机内部表示和程序员和计算机交流的语言断层,而程序设计语言和自然语言之间又有一个断层,这个断层就需要靠程序员的集体或个人脑力劳动来弥补。软件总体质量的好坏除了对软件工程的设计者相关,程序设计者的水平至关重要。从自然语言到计算机能够读懂的程序设计语言,是对程序设计能力的考验。

仅仅是对程序设计语言的熟悉理解和熟练操作运用是不行的。算法的设计是一个多方面的工作,一方面,我们需要对实际工作中所涉及到的可行性进行分析,另一方面,我们还需要完成对实际问题的研究性解决。有时候,一个问题的解并不是唯一的,而多解问题并不是每个解都是同质同性的,它们之间或多或少有这样那样量度甚至质的区别。比如在我们这个课题中,我们选择了汉诺塔求解演示。通过计算机设计的算法,求解得到较优化的图形演示方案。我们所涉及的问题是怎样尽可能地使界面美观而又能直观、生动地达到演示效果,在这些方案中,不断地比较,进行优化选择。

前面已经提到了,经过反复的测试比较,还能找出这个设计的很多不足甚至于错误,也就是说,我现在所做的设计并不是那么尽善尽美的。但它相比较其它同类型的演示程序,已经有了很大的进步。

最后,感谢指导老师悉心指导,感谢同学们无私的帮助。

汉诺塔问题的三种实现

// test_project.cpp : 定义控制台应用程序的入口点。//汉诺塔问题的 // //递归实现 /*#include "stdafx.h" #include using namespace std; int count=0;//记录移动到了多少步 void Move(int n,char From,char To); void Hannoi(int n,char From, char Pass ,char To); //把圆盘从From,经过pass,移动到To int main() { int n_count=0; cout<<"请输入圆盘个数:"; cin>>n_count; Hannoi(n_count,'A','B','C'); } void Move(int n,char From,char To)

{ count++; cout<<"第"<

/*后来一位美国学者发现一种出人意料的简单方法,只要轮流进行两步操作就可以了。首先把三根柱子按顺序排成品字型,把所有的圆盘按从大到小的顺序放在柱子A上,根据圆盘的数量确定柱子的排放顺序:若n为偶数,按顺时针方向依次摆放A B C; 若n为奇数,按顺时针方向依次摆放A C B。 ()按顺时针方向把圆盘从现在的柱子移动到下一根柱子,即当n为偶数时,若圆盘在柱子A,则把它移动到B;若圆盘在柱子B,则把它移动到C;若圆盘在柱子C,则把它移动到A。 ()接着,把另外两根柱子上可以移动的圆盘移动到新的柱子上。即把非空柱子上的圆盘移动到空柱子上,当两根柱子都非空时,移动较小的圆盘。这一步没有明确规定移动哪个圆盘,你可能以为会有多种可能性,其实不然,可实施的行动是唯一的。 ()反复进行()()操作,最后就能按规定完成汉诺塔的移动。 所以结果非常简单,就是按照移动规则向一个方向移动金片: 如阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C 汉诺塔问题也是程序设计中的经典递归问题,下面我们将给出递归和非递归的不同实现源代码。*/ /*#include "stdafx.h" #include #include

汉诺塔非递归算法C语言实现

汉诺塔非递归算法C语言实现 #include #include #define CSZL 10 #define FPZL 10 typedef struct hanoi { int n; char x,y,z; }hanoi; typedef struct Stack { hanoi *base,*top; int stacksize; }Stack; int InitStack(Stack *S) { S->base=(hanoi *)malloc(CSZL*sizeof(hanoi)); if(!S->base) return 0; S->top=S->base; S->stacksize=CSZL; return 1; } int PushStack(Stack *S,int n,char x,char y,char z) { if(S->top-S->base==S->stacksize) { S->base=(hanoi *)realloc(S->base,(S->stacksize+FPZL)*sizeof(hanoi)); if(!S->base) return 0; S->top=S->base+S->stacksize; S->stacksize+=FPZL; } S->top->n=n; S->top->x=x; S->top->y=y; S->top->z=z; S->top++; return 1; } int PopStack(Stack *S,int *n,char *x,char *y,char *z) { if(S->top==S->base)

汉诺塔c++程序

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 { Hanoi(platesCount -1, from, by, dest); Hanoi(1, from, dest, by); Hanoi(platesCount -1, by, dest, from); } } // Advance one step to solve Hanoi void HanoiDrawer::SolveNextStep() { int platesCount , source , destination , intermediate; if(listSavedState.size()==0) { this->Hanoi(this->iPlatesCount, HanoiDrawer::SOURCE , HanoiDrawer::DESTINATION, HanoiDrawer::INTERMEDIATE); } if(listSavedState.size() % 4 != 0 ) { return; } platesCount = listSavedState.front(); listSavedState.pop_front(); source = listSavedState.front(); listSavedState.pop_front(); destination = listSavedState.front(); listSavedState.pop_front(); intermediate = listSavedState.front(); listSavedState.pop_front();

用VB设计汉诺塔动画游戏

本栏目责任编辑:谢媛媛软件设计开发Computer Knowledge and Technology 电脑知识 与技术第5卷第30期(2009年10月)用VB 设计汉诺塔动画游戏 刘德强 (无锡职业技术学院,江苏无锡214024) 摘要:汉诺塔问题是程序设计教学中关于递归调用的经典案例。该文介绍了用VB 设计汉诺塔动画游戏程序的基本过程,其中重点介绍了用VB 的自定义数据类型和图形处理技术设计游戏步点状态记录和动画效果的方法。 关键词:VB ;汉诺塔;动画 中图分类号:TP311文献标识码:A 文章编号:1009-3044(2009)30-8460-03 The Designing of Hanoi Towers Animation Game by VB LIU De-qiang (Wuxi Institute of Technology,Wuxi 214024,China) Abstract:The Hanoi Towers is a typical case of recursive calls in programming teaching.This paper introduces the basic process of design -ing Hanoi Towers animation game by VB,focuses on recording game state between two steps and designing animation by self-defined data type and graph skill in VB. Key Words:VB;Hanoi;animation 汉诺塔问题源自印度的一个古老传说,传至现代演变成了汉诺塔游戏:有A 、B 、C 三个垂直杆和若干个大小各不相同的圆片。开始时圆片全部套在A 杆上,且从下至上圆片大小依次递减。要求借助B 杆,将圆片全部移到C 杆上,每次只能移动一片,并且整个过程中三个杆上的圆片都必须保持大的在下小的在上。游戏的难度由开始时放置在A 杆上圆片的个数进行控制。 1游戏步点状态记录设计 笔者设计的汉诺塔游戏程序主要包括演示和游戏两方面的功能。演示功能实现的是根据汉诺塔问题算法预先计算出的圆片移动顺序由计算机自行对圆片进行移动;而游戏功能是指计算机通过人机交互界面根据游戏者的实时操作顺序进行圆片的移动。图1是程序运行时界面。无论是演示还是游戏,计算机执行的基本动作元素是相同的,即圆片从一个杆上移动到另一个杆上,这一过程体现在程序设计中就是在新的位置对圆片图形进行重画,它与每个杆的步点状态密切相关。 步点状态是指每完成一步操作以后,开始下一步操作之前,一个杆上 的圆片数量及各圆片的位置和大小等多个特征综合构成的状态,是多个 数据的集合。将开始时圆片数记为n ,从初始状态圆片都在A 杆上,到终 止状态n 个圆片移到C 杆上,其间每次移动圆片,各杆的步点状态都会 发生变化。游戏进程中“记”住各杆的当前步点状态,是实现不断移动圆片 的关键。以要移动A 杆上的一个圆片到B 杆为例:要判断圆片根据规则 是否可以移动及圆片移动后放置在B 杆的什么位置(y 坐标),就必须知 道当前B 杆上最上端圆片的大小和B 杆上当前圆片数量,即B 杆的当前 步点状态。综合以上分析,游戏步点状态记录是程序设计中的要点。 鉴于描述步点状态需要多个数据,且数据间相互关联并构成整体,笔 者在设计中采用了自定义数据类型的方法,数据类型名称为circles ,所含 内容和定义格式如下: Type circles counts As integer r()As integer x As integer y()As integer End Type circles 类型中,数据成员counts 用于记录杆上实际圆片数,r 用于记录各圆片的半径,x 记录各圆片圆心的x 坐标,y 记录各圆片圆心的y 坐标。因为每次游戏设置的初始圆片数是不确定的且游戏进程中各杆都可能出现多个圆片,所以数据成员r 和y 定义为动态数组。 数据类型circles 定义以后,先使用该类型定义三个实例a 、b 、c ,分别代表A 、B 、C 三个杆的步点状态。语句如下: Dim a As circles ,b As circles ,c As circles 当初始圆片数量确定后(记为n),可使用下列语句对A 杆的步点状态a 进行初始化。 投稿日期:2009-08-22 作者简介:刘德强(1965-),江苏靖江人,无锡职业技术学院讲师。 图1运行界面ISSN 1009-3044Computer Knowledge and Technology 电脑知识与技术Vol.5,No.30,October 2009,pp.8460-8462E-mail:xsjl@https://www.360docs.net/doc/6b15698958.html, https://www.360docs.net/doc/6b15698958.html, Tel:+86-551-569096356909648460

数据结构实验报告汉诺塔

实验报告书 课程名:数据结构 题目:汉诺塔 班级: 学号: 姓名: 评语: 成绩:指导教师: 批阅时间:年月日

一、目的与要求 1)掌握栈与队列的数据类型描述及特点; 2)熟练掌握栈的顺序和链式存储存表示与基本算法的实现; 3)掌握队列的链式存储表示与基本操作算法实现; 4) 掌握栈与队列在实际问题中的应用和基本编程技巧; 4)按照实验题目要求独立正确地完成实验内容(提交程序清单及相关实验数据与运行结果); 5)认真书写实验报告,并按时提交。 二、实验内容或题目 汉诺塔问题。程序结果:给出程序执行过程中栈的变化过程与圆盘的搬动状态。 三、实验步骤与源程序 源程序: / *编译环境Visual C++6.0 */ #include "stdafx.h" #include #include void move(int h,char c,char f) { printf("%d:%c--->%c\n",h,c,f); } void hanoi(int n,char x,char y,char z) { if(n==1) move(1,x,z); else { hanoi(n-1,x,z,y); move(n,x,z); hanoi(n-1,y,x,z); } } void main(void) { int flag; do { printf(" 汉诺塔问题\n\n"); printf("[1] 开始\n"); printf("[2] 退出\n"); printf("1--2请选择:"); scanf("%d",&flag); printf("\n"); switch(flag) { case 1:

汉诺塔 java 程序

汉诺塔java 程序 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class AutoMoveDisc extends JDialog implements ActionListener{ int amountOfDisc=3; TowerPoint [] pointA,pointB,pointC; char [] towerName; Container con; StringBuffer moveStep; JTextArea showStep; JButton bStart,bStop,bContinue,bClose; Timer time; int i=0,number=0; AutoMoveDisc(Container con){ setModal(true); setTitle("自动演示搬盘子过程"); this.con=con; moveStep=new StringBuffer(); time=new Timer(1000,this); time.setInitialDelay(10); showStep=new JTextArea(10,12); bStart=new JButton("演示"); bStop=new JButton("暂停"); bContinue=new JButton("继续"); bClose=new JButton("关闭"); bStart.addActionListener(this); bStop.addActionListener(this); bContinue.addActionListener(this); bClose.addActionListener(this); JPanel south=new JPanel(); south.setLayout(new FlowLayout()); south.add(bStart); south.add(bStop); south.add(bContinue); south.add(bClose); add(new JScrollPane(showStep),BorderLayout.CENTER); add(south,BorderLayout.SOUTH); setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); towerName=new char[3]; addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ time.stop(); setVisible(false);

汉诺塔问题实验报告

1.实验目的: 通过本实验,掌握复杂性问题的分析方法,了解汉诺塔游戏的时间复杂性和空间复杂性。 2.问题描述: 汉诺塔问题来自一个古老的传说:在世界刚被创建的时候有一座钻石宝塔(塔A),其上有64个金碟。所有碟子按从大到小的次序从塔底堆放至塔顶。紧挨着这座塔有另外两个钻石宝塔(塔B和塔C)。从世界创始之日起,婆罗门的牧师们就一直在试图把塔A 上的碟子移动到塔C上去,其间借助于塔B的帮助。每次只能移动一个碟子,任何时候都不能把一个碟子放在比它小的碟子上面。当牧师们完成任务时,世界末日也就到了。 3.算法设计思想: 对于汉诺塔问题的求解,可以通过以下三个步骤实现: (1)将塔A上的n-1个碟子借助塔C先移到塔B上。 (2)把塔A上剩下的一个碟子移到塔C上。 (3)将n-1个碟子从塔B借助于塔A移到塔C上。 4.实验步骤: 1.用c++ 或c语言设计实现汉诺塔游戏; 2.让盘子数从2 开始到7进行实验,记录程序运行时间和递 归调用次数; 3.画出盘子数n和运行时间t 、递归调用次数m的关系图, 并进行分析。 5.代码设计: Hanio.cpp #include"stdafx.h" #include #include #include void hanoi(int n,char x,char y,char z) { if(n==1) { printf("从%c->搬到%c\n",x,z); } else { hanoi(n-1,x,z,y); printf("从%c->%c搬到\n",x,z); hanoi(n-1,y,x,z); }

汉诺塔问题的非递归算法分析

汉诺塔递归与非递归算法研究 作者1,作者2,作者33 (陕西师范大学计算机科学学院,陕西西安 710062) 摘要: 摘要内容(包括目的、方法、结果和结论四要素) 摘要又称概要,内容提要.摘要是以提供文献内容梗概为目的,不加评论和补充解释,简明,确切地记述文献重要内容的短文.其基本要素包括研究目的,方法,结果和结论.具体地讲就是研究工作的主要对象和范围,采用的手段和方法,得出的结果和重要的结论,有时也包括具有情报价值的其它重要的信息.摘要应具有独立性和自明性,并且拥有与文献同等量的主要信息,即不阅读全文,就能获得必要的信息. 关键词:关键词1; 关键词2;关键词3;……(一般可选3~8个关键词,用中文表示,不用英文 Title 如:XIN Ming-ming , XIN Ming (1.Dept. of ****, University, City Province Zip C ode, China;2.Dept. of ****, University, City Province Zip C ode, China;3.Dept. of ****, University, City Province Zip C ode, China) Abstract: abstract(第三人称叙述,尽量使用简单句;介绍作者工作(目的、方法、结果)用过去时,简述作者结论用一般现在时) Key words: keyword1;keyword2; keyword3;……(与中文关键词对应,字母小写(缩略词除外)); 正文部分用小5号宋体字,分两栏排,其中图表宽度不超过8cm.。设置为A4页面 1 引言(一级标题四号黑体加粗) 这个问题当时老和尚和众僧们,经过计算后,预言当所有的盘子都从基柱A移到基座B上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。其实,不管这个传说的可信度有多大,如果考虑把64个盘子,由一个塔柱上移到另一根塔柱上,并且始终保持上小下大的顺序。假设有n个盘子,移动次数是f(n).显然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此后不难证明f(n)=2n-1。n=64时, f(64)= 2^64-1=18446744073709551615 假如每秒钟一次,共需多长时间呢?一年大约有 31536926 秒,计算表明移完这些金片需要5800多亿年,比地球寿命还要长,事实上,世界、梵塔、庙宇和众生都早已经灰飞烟灭。 对传统的汉诺塔问题,目前还有不少的学者继续研究它的非递归解法,本文通过对递归算法的研究……. 提示:(1)可以定义问题的规模n,如盘子的数量;(2)塔柱的数量(目前有部分理论可以支撑,不妨用计算机实现)分析规模的变化与算法的复杂度比较。(3)可以对经典的汉诺塔问题条件放松、加宽,如在经典的汉诺塔问题中大盘只能在小盘下面,放松其他条件可以定义相邻两个盘子必须满足大盘只能在小盘下面。其它盘子不作要求。 2 算法设计 2.1 汉诺塔递归算法描述(二级标题小五黑体加粗) 用人类的大脑直接去解3,4或5个盘子的汉诺塔问题还可以,但是随着盘子个数的增多,问题的规模变的越来越大。这样的问题就难以完成,更不用说吧问题抽象成循环的机器操作。所以类似的问题可用递归算法来求解。下面n个盘的汉

汉诺塔游戏设计过程

兰州交通大学 数理与软件工程学院 课程设计报告 2011 ~2012学年第二学期 课程名称数据结构 设计题目汉诺塔游戏程序 班级信计1001班 小组成员张章、王欣、李贵生 报告者李贵生201005235 指导老师金静 2012年6月

一、实验目的: 通过此次C++实训,一方面加深了对C++语言的了解,而不只是单单的在课本中学到的那些理论。通过学生动手亲自编写,平时乏味的课程,变的生动有趣。平时在课堂上学到的东西可以自己动手编写,将其转化成一些实用的技能。另一方面,通过学生小组完成任务,提高团队意识,增加凝聚力,让同学们意识到团结就是力量,每个人都是重要的一份子。 二、题目:汉诺塔游戏程序 <1> 问题描述:在平面上有三个位置A、B、C,在A位置上有n 个大小不等的圆盘、小盘压在大盘上形成圆盘堆。要求将A位置的N个圆盘通过B位置移动到C位置上,并按同样的顺序叠放。 移动圆盘时必须遵循以下规则: 1.每一次只能移动一个圆盘 2.圆盘可以放在A、B、C任何一个塔座上 3.任何时刻都不能将大圆盘压在小圆盘上 <2> 基本要求: 圆盘的个数从键盘输入(如3-64等);用动画的形式在屏幕上显示盘的移动。 三、问题分析和任务定义 1、已知有三个塔(1、 2、3)和n个从大到小的金碟子,初始状态时n个碟子按从大到小的次序从塔1的底部堆放至顶部。 2、要求把碟子都移动到塔2(按从大到小的次序从塔2的底部堆

放至顶部)。 3、每次移动一个碟子。 4、任何时候、任何一个塔上都不能把大碟子放到小碟子的上面。 5、可以借助塔3。 先考虑a杆下面的盘子而非杆上最上面的盘子,于是任务变成了: 1、将上面的N个盘子移到b杆上; 2、将a杆上剩下的盘子移到c杆上; 3、将b杆上的全部盘子移到c杆上。 将这个过程继续下去,就是要先完成移动n个盘子、n-1个盘子、n-2个盘子....1个盘的工作。 四、课题介绍: 4.1 汉诺塔问题初始模型: 4.2 实现步骤: 为满足题目中盘子的移动问题,必须遵循的条件是:一次

汉诺塔 面向对象课程设计

数据库课程设计报告------------题目:汉诺塔 学院名称:计算机学院 专业名称:计算机科学与技术 班级:计算机08-08班 学号:0804010807 姓名:田昊 指导教师:孙冬璞 起始时间:2011年1月5日-------2011年1月9日

摘要 汉诺塔(又称河内塔)问题是一个古典的数学问题,是一个用递归方法解题的典型例子。问题是这样的:开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。 利用计算机图形学进行汉诺塔演示程序设计,是利用C语言绘图函数实现汉诺塔的递归算法图形界面演示过程。通过C语言实现图形学的绘图,程序控制,以及区域填充,并根据汉诺塔的算法原理实现大小不同的盘子移动的全过程演示。 1 需求分析 1.1 需求概述 汉诺塔演示程序设计是计算机图形学中图形变换的内容之一。而图形学中的图形变换的概念是由简单图形生成复杂图形,可用二维图形表示三维形体,甚至可以对静态图形经过快速变换而获得图形的动态显示效果。其任务是研究各点坐标之间的变化规律。而本次课程设计就是利用C语言以及图形函数实现汉诺塔的递归算法来进行其盘块移动的全过程显示。在TC环境中要实现这样的功能,就要牵涉到图形设备接口的知识。Windows图形设备接口是为与设备无关的图形设计的,是Windows系统的重要组成部分,负责系统与用户或绘图程序之间的信息交换,并控制在输出设备上显示图形或文字。应用程序必须通知图形设备接口来加载特定的设备驱动,一旦驱动得以加载,就可以准备应用设备进行相关的操作这些任务都要通过创建和维护设备描述表来完成。在实现汉诺塔演示程序设计时,是利用坐标系统而得到的,而在Windows应用程序中有两种坐标系统:设备坐标系统和逻辑坐标系统。其中设备坐标系统中又有三种相互独立的坐标系统:屏幕坐标系统、窗口坐标系统和用户区坐标系统。这些坐标系统均以像素点来表示度量的单位。屏幕坐标系统使用整个屏幕作为坐标区域,原点为屏幕原点。窗口坐标系统使用了边界在内的应用程序的窗口作为坐标区域。窗口边界的左上角是坐标系统的原点。用户坐标系统是最经常使用的坐标系统。用户区是窗口工作区,不包括窗口边界、菜单条及滚动条等。用户一般只需操作应用程序的用户区,因此用户区坐标系统对大多数应用程序都是适用的。

汉诺塔程序实验报告

实验题目: Hanoi 塔问题 一、问题描述: 假设有三个分别命名为 A , B 和C 的塔座,在塔座 B 上插有n 个直径大小各不相同、从小到 大编号为1, 2,…,n 的圆盘。现要求将塔座 B 上的n 个圆盘移至塔座 A 上并仍按同样顺序 叠排,圆盘移动时必须遵守以下规则: (1 )每次只能移动一个圆盘; (2)圆盘可以插在 A , B 和C 中任一塔上; ( 3)任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。 要求: 用程序模拟上述问题解决办法,并输出移动的总次数, 圆盘的个数从键盘输入; 并想 办法计算出程序运行的时间。 二、 算法思路: 1 、建立数学模型: 这个问题可用递归法解决,并用数学归纳法又个别得出普遍解法: 假设塔座B 上有3个圆盘移动到塔座 A 上: (1) "将塔座B 上2个圆盘借助塔座 A 移动到塔座C 上; (2) "将塔座B 上1个圆盘移动到塔座 A 上; (3) "将塔座C 上2个圆盘借助塔座 B 移动到塔座A 上。 其中第 2步可以直接实现。第 1步又可用递归方法分解为: 1.1"将塔座B 上1个圆盘从塔座 1.2"将塔座B 上1个圆盘从塔座 1.3"将塔座A 上1个圆盘从塔座 第 3 步可以分解为: 3.1将塔座C 上1个圆盘从塔座 3.2将塔座C 上1个圆盘从塔座 3.3将塔座B 上1个圆盘从塔座 综上所述:可得到移动 3 个圆盘的步骤为 B->A,B->C, A->C, B->A, C->B, C->A, B->A, 2、算法设计: 将n 个圆盘由B 依次移到A , C 作为辅助塔座。当 n=1时,可以直接完成。否则,将塔 座B 顶上的n-1个圆盘借助塔座 A 移动到塔座C 上;然后将圆盘B 上第n 个圆盘移到塔 座A 上;最后将塔座 C 上的n-1个圆盘移到塔座 A 上,并用塔座B 作为辅助塔座。 三、原程序 #include #include #include int times = 0; void move(char a, char b) { printf("%c > %c \n", a,b); } void hno(int n,char a , char b, char c) { if (n==1) { move(a,c); times ++; } X 移动到塔座 A ; X 移动到塔座 C ; Z 移动到塔座 C 。 Y 移动到塔座 Y 移动到塔座 X 移动到塔座 B ; A ;

汉诺塔问题非递归算法详解

Make By Mr.Cai 思路介绍: 首先,可证明,当盘子的个数为n 时,移动的次数应等于2^n - 1。 然后,把三根桩子按一定顺序排成品字型(如:C ..B .A ),再把所有的圆盘按至上而下是从小到大的顺序放在桩子A 上。 接着,根据圆盘的数量确定桩子的排放顺序: 若n 为偶数,按顺时针方向依次摆放C ..B .A ; 若n 为奇数,按顺时针方向依次摆放B ..C .A 。 最后,进行以下步骤即可: (1)首先,按顺时针方向把圆盘1从现在的桩子移动到下一根桩子,即当n 为偶数时,若圆盘1在桩子A ,则把它移动到B ;若圆盘1在桩子B ,则把它移动到C ;若圆盘1在桩子C ,则把它移动到A 。 (2)接着,把另外两根桩子上可以移动的圆盘移动到新的桩子上。 即把非空桩子上的圆盘移动到空桩子上,当两根桩子都非空时,移动较小的圆盘。 (3)重复(1)、(2)操作直至移动次数为2^n - 1。 #include #include using namespace std; #define Cap 64 class Stake //表示每桩子上的情况 { public: Stake(int name,int n) { this->name=name; top=0; s[top]=n+1;/*假设桩子最底部有第n+1个盘子,即s[0]=n+1,这样方便下面进行操作*/ } int Top()//获取栈顶元素 { return s[top];//栈顶 } int Pop()//出栈 { return s[top--];

} void Push(int top)//进栈 { s[++this->top]=top; } void setNext(Stake *p) { next=p; } Stake *getNext()//获取下一个对象的地址 { return next; } int getName()//获取当前桩子的编号 { return name; } private: int s[Cap+1];//表示每根桩子放盘子的最大容量 int top,name; Stake *next; }; void main() { int n; void hanoi(int,int,int,int); cout<<"请输入盘子的数量:"; cin>>n; if(n<1) cout<<"输入的盘子数量错误!!!"<

汉诺塔程序解读

hanoi塔程序如下: main() {hanoi(3,'A','B','C'); } hanoi(n,a,b,c) int n; char a,b,c; {if (n==1) printf("%c-->%c\n",a,c); else {hanoi (n-1,a,c,b); printf ("%c-->%c\n",a,c); hanoi (n-1,b,a,c);} } 运行结果: A-->C A-->B C-->B A-->C B-->A B-->C A-->C 问题: hanoi(n,a,b,c) int n; char a,b,c; {if (n==1) printf("%c-->%c\n",a,c); else {hanoi (n-1,a,c,b); printf ("%c-->%c\n",a,c); hanoi (n-1,b,a,c);} } 我给你详细解释下这个程序中的代码吧。我也是刚学,希望对你有用。可能有些不好之处,还希望谅解。 先说下这个问题的整体思想: 1,如果只有1个盘,那么就直接把这个盘从A移动到C上。

2,如果存在两个盘,那么先把第一个盘移动到B上,在把最下面一个盘移动到C上,在把B上的盘移动到C上。 3,这样,我们可以得出一个结论,如果存在N个盘,可以先把上面N-1个盘通过C 移动到B上,然后把第N个盘移动到C上,再把B上的N个盘通过A 移动到C上。 if (n==1) printf("%c-->%c\n",a,c); 这一句,表示只有1个盘子的时候,那么就是把第一个盘子直接移到第三个盘子上。 else {hanoi (n-1,a,c,b); 如果超过一个盘字,则需要先把N-1个盘子通过C 移动到B上。 printf ("%c-->%c\n",a,c); 把剩下的第N个盘,从A移动到C上。 hanoi (n-1,b,a,c);} 再把剩下的在B上的N-1个盘,通过A移动到C上。 这属于一个递归算法。 现在,N=3。 我们看下程序怎么运行的。 else {hanoi (n-1,a,c,b); printf ("%c-->%c\n",a,c); hanoi (n-1,b,a,c);} N=3,也就是开始程序会执行 hanoi (2,a,c,b);这句语句。 再看,2还是大于1,所以 程序会继续运行。注意,这里,为hanoi (2,a,c,b); C和B 换了位置。 hanoi (2,a,c,b); 我们把数字代入,得出。 根据N=2,C和B 互换。以及下面的代码,得出 ````````````````````````````````````````````````

汉诺塔探趣

“汉诺塔”问题探趣 洞头县实验小学 502班叶钫舟 指导老师洞头县实验小学陈素萍 一、问题的提出: 一位法国数学家曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。 尽管这个传说并不可信,但现在却成就了一种益智玩具━━“汉诺塔”(如图)的诞生。对下面这个8层汉诺塔,如何按以上要求将所有的圆盘从最左边的柱子上移到最右边的柱子上来呢?并如何保证移动的步子最少呢? 对这个富有挑战性的游戏,我非常有兴趣,于是我开始了研究! 二、研究过程: 1、简化器材,方便携带,随时演练,不断研究 “汉诺塔”游戏器材,体积较大,质量也大,不方便随身携带,因而也不能让我随时随地进行演练。 考虑到它最关键的是体现由小到大的一种排列,我用扑克牌同色的1(A),2,3,4,5,6,7,8来代替这个“汉诺塔”,平时演练,只要假想桌子上有左0、中1、右2三个档位即可,将这8张扑克牌从上到下按由小到大的顺序叠放在一起,放置在左边档位0处,然后将按游戏规则将它们依次全部移到最右边档位2处即可。 我把这种用扑克牌玩“汉诺塔”游戏称为“汉诺牌”,这样就很方便了!有时忘记了带扑克牌,我就用笔在纸上写下1~8这张8张“牌”,就可以玩了!

汉诺塔教材

有趣的汉诺塔 ——思维潜能开发校本教材 河山实验学校小学部时美娟 前言 数学教学游戏(思维潜能开发)课程是按照《优质课堂与现代教学技艺运用的研究》总课题组倡导的“教学游戏”理念,借鉴国内外“思维潜能开发”的有效经验,结合心理学、认知科学和脑科学的最新研究成果,经过本土化再造后, 逐步形成的教学游戏课程的训练体系。其核心是以“益智”为载体,通过愉悦的探究体验活动,开发学生的思维潜能,促进学生身心健康的全面发展。 教学游戏(思维潜能开发)课程实质上是一种思维潜能开发训练。它采用课程化的训练体系,试图跳出目前“题型”和“分数”的羁绊,在充满游戏乐趣和紧张思维碰撞的精神活动中挑战固有的思维定势,开发学生的智慧潜能。它不仅是一种在探索中进行创新思维的学习,还是落实《义务教育阶段数学课程标准2011年版》对“四基、四能”教学要求的一种有效手段。其目的在于让学生在实践、体验中培养其创新意识、践行能力,团结协作、社会活动等方面的能力及技艺。 河内塔是根据一个传说形成的一个问题:有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则。问:如何移?最少要移动多少次? 目录 1 基本介绍 2 历史传说 3 相似问题 4 concreteHAM 4.1 在分析⑵之前 4.2 讨论问题⑵, 4.3 算法介绍 5 汉诺塔问题的程序实现 5.1 汉诺塔问题的递归实现 5.2 汉诺塔问题的非递归实现 5.3 汉诺塔问题的递归Java语言实现 5.4 汉诺塔问题的递归pascal语言实现

汉诺塔C递归算法详细解答

汉诺塔C递归算法详细解答 程序如下: void move(char x,char y){ printf("%c-->%c\n",x,y); } void hanoi(intn,charone,chartwo,char three){ /*将n个盘从one座借助two座,移到three座*/ if(n==1) move(one,three); else{ hanoi(n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three); } } main(){ int n; printf("input the number of diskes:"); scanf("%d",&n); printf("The step to moving %3d diskes:\n",n); hanoi(n,'A','B','C'); } Hanoi塔问题, 算法分析如下,设A上有n个盘子。 如果n=1,则将圆盘从A直接移动到C。 如果n=2,则: (1)将A上的n-1(等于1)个圆盘移到B上; (2)再将A上的一个圆盘移到C上; (3)最后将B上的n-1(等于1)个圆盘移到C上。 如果n=3,则: A)将A上的n-1(等于2,令其为n`)个圆盘移到B(借助于C),步骤如下:(1)将A上的n`-1(等于1)个圆盘移到C上。 (2)将A上的一个圆盘移到B。 (3)将C上的n`-1(等于1)个圆盘移到B。 B)将A上的一个圆盘移到C。 C)将B上的n-1(等于2,令其为n`)个圆盘移到C(借助A),步骤如下:(1)将B上的n`-1(等于1)个圆盘移到A。 (2)将B上的一个盘子移到C。 (3)将A上的n`-1(等于1)个圆盘移到C。到此,完成了三个圆盘的移动过程。

C#汉诺塔演示和代码

汉诺塔的演示界面: 本系统显示的是汉诺塔的演示效果,分别有播放,暂停,和停止,右边显示的是每一步的动作,同时记录操作次数,可以调节演示的速度。 汉诺塔界面代码: namespace honio4 { partial class Form1 { ///

/// 必需的设计器变量。 /// https://www.360docs.net/doc/6b15698958.html,ponentModel.IContainer components = null; /// /// 清理所有正在使用的资源。 /// /// 如果应释放托管资源,为true;否则为false。 protected override void Dispose(bool disposing) { if (disposing && (components != null)) {

components.Dispose(); } base.Dispose(disposing); } #region Windows 窗体设计器生成的代码 ///

/// 设计器支持所需的方法- 不要 /// 使用代码编辑器修改此方法的内容。 /// private void InitializeComponent() { https://www.360docs.net/doc/6b15698958.html,ponents = new https://www.360docs.net/doc/6b15698958.html,ponentModel.Container(); this.panel1 = new System.Windows.Forms.Panel(); this.panel2 = new System.Windows.Forms.Panel(); this.panel3 = new System.Windows.Forms.Panel(); https://www.360docs.net/doc/6b15698958.html,bel1 = new https://www.360docs.net/doc/6b15698958.html,bel(); this.udLevels = new System.Windows.Forms.NumericUpDown(); this.btnStart = new System.Windows.Forms.Button(); this.btnPause = new System.Windows.Forms.Button(); this.btnStop = new System.Windows.Forms.Button(); https://www.360docs.net/doc/6b15698958.html,bel2 = new https://www.360docs.net/doc/6b15698958.html,bel(); this.trackSpeed = new System.Windows.Forms.TrackBar(); https://www.360docs.net/doc/6b15698958.html,bel3 = new https://www.360docs.net/doc/6b15698958.html,bel(); this.progress = new System.Windows.Forms.ProgressBar(); this.tmrPlay = new System.Windows.Forms.Timer(https://www.360docs.net/doc/6b15698958.html,ponents); this.listBox1 = new System.Windows.Forms.ListBox(); https://www.360docs.net/doc/6b15698958.html,bel4 = new https://www.360docs.net/doc/6b15698958.html,bel(); https://www.360docs.net/doc/6b15698958.html,bel5 = new https://www.360docs.net/doc/6b15698958.html,bel(); https://www.360docs.net/doc/6b15698958.html,bel6 = new https://www.360docs.net/doc/6b15698958.html,bel(); https://www.360docs.net/doc/6b15698958.html,bel7 = new https://www.360docs.net/doc/6b15698958.html,bel(); https://www.360docs.net/doc/6b15698958.html,bel8 = new https://www.360docs.net/doc/6b15698958.html,bel(); ((https://www.360docs.net/doc/6b15698958.html,ponentModel.ISupportInitialize)(this.udLevels)).BeginInit(); ((https://www.360docs.net/doc/6b15698958.html,ponentModel.ISupportInitialize)(this.trackSpeed)).BeginInit(); this.SuspendLayout(); // // panel1 // this.panel1.Location = new System.Drawing.Point(16, 16); https://www.360docs.net/doc/6b15698958.html, = "panel1"; this.panel1.Size = new System.Drawing.Size(96, 144); this.panel1.TabIndex = 7; this.panel1.Paint += new

相关文档
最新文档