汉诺塔程序实验报告

汉诺塔程序实验报告
汉诺塔程序实验报告

实验题目:

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

else

{

hn o( n-1,a,c,b);

move(a,c);

times ++;

hn o( n-1,b,a,c);

}

}

void mai n()

{

un sig ned start,fi ni sh;

int N;

printf("请输入汉诺塔的层数:");

scan f("%d",&N);

start=GetTickCou nt();〃

hn o(N,'B',C,'A');

fini sh=GetTickCou nt();

float time=(fi ni sh-start)/1000.0;

printf("共移动了%d 次! \n",times);

cout<<"总共需要时间为:"<

}

四:

-C:MJ5er5\5t>ny\Deslrtop\hornework,,..^3L i]nI31\D#bug\Cppl ewe*

五.结论分析通过对上述递归在Hanoi 塔问题上的应用分析,可以得出如下结论:递归应用中的Hanoi 塔问题分析递归应用中的

1、Hanoi 塔问题中函数调用时系统所做工作一个函数在运行期调用另一个函数时,在运行被调

用函数之前,系统先完成 3 件事:

①将所有的实参、返回地址等信息传递给被调用函数保存。

②为被调用函数的局部变量分配存储区;

◎将控制转移到被调用函数的入口。

从被调用函数返回调用函数前,系统也应完成 3 件事:

①保存被调用函数的结果;

②释放被调用函数的数据区;

③依照被调用函数保存的返回地址将控制转移到调用函数。当有多个函数构成嵌套调

用时,按照“后调用先返回”的原则,上述函数之间的信息传递和控制转移必须通

过“栈”来实现,即系统将整个程序运行时所需的数据空间安排在一个栈中,每当调

用一个函数时,就为其在栈顶分配一个存储区,每当从一个函数退出时,就释放其存

储区,因此当前运行函数的数据区必在栈顶。

2、递归调用过程中,在程序执行之前无法知道控制这种调用栈的规模,因为这一规模取决于递归调用的次序。在这种情况下,程序的地址空间可能动态变化;

3、递归应用于程序设计时,结构清晰、程序易读,编制和调试程序很方便,不需要用户自行管理递归工作栈。但递归应用于计算机时需要占用大量系统资源(包括堆栈、软中断和存贮空间等),并消耗大量处理时间。因此,可以考虑采用并行计算进行处理,但

4、递归是串行的,其第n 步运算依赖于第n-1 步运算,所以在计算机软件理论上不存在递归问题并行计算的可能性。实际上是否存在并行递归计算有待进一步探讨。

汉诺塔栈c语言

计算机科学与工程学院 《算法与数据结构》试验报告[二] 专业班级10级计算机工程02 试验地点计算机大楼计工教研室学生学号1005080222 指导教师蔡琼 学生姓名肖宇博试验时间2012-4-14 试验项目算法与数据结构 试验类别基础性()设计性()综合性(√)其它() 试验目的及要求(1)掌握栈的特点及其存储方法;(2)掌握栈的常见算法以及程序实现;(3)了解递归的工作过程。 成 绩评定表 类别评分标准分值得分合计 上机表现积极出勤、遵守纪律 主动完成设计任务 30分 程序与报告程序代码规范、功能正确 报告详实完整、体现收获 70分 备注: 评阅教师: 日期:年月日

试 验 内 容 一、实验目的和要求 1、实验目的: (1)掌握栈的特点及其存储方法; (2)掌握栈的常见算法以及程序实现; (3)了解递归的工作过程。 2、实验内容 Hanoi 塔问题。(要求4个盘子移动,输出中间结果) 3、实验要求: 要求实现4个盘子的移动,用递归和栈实现。 二、设计分析 三个盘子Hanoi 求解示意图如下: 三个盘子汉诺塔算法的运行轨迹: B A B C A B C A C A B C (a (b) (c (d) ⑸ ⑼ ⑶ Hanio(3,A,B,C) Hanio(3,A,B,C) Hanio(2,A,C,B) Hanio(2,A,C,B) Hanio(1,A,B,C) Hanio(1,A,B,C) Move (A,C) Move (A,B) Hanio(1,C,A,B) Hanio(1,C,A,B) Move (C,B) Move (A,B) Hanio(2,B,A,C) Hanio(2,B,A,C) Hanio(1,B,C,A) Hanio(1,B,C,A) Move (B,C) Hanio(1,A,B,C) Hanio(1,A,B,C) Move (A,C) Move (B,A) 递归第一层 递归第二层 递归第三层 ⑴ ⑵ ⑷ ⑹ ⑺ ⑻ ⑽ ⑾ ⑿ ⒀ ⒁

07141326汉诺塔-课程设计

汉诺塔课程设计 报告 目录 一、需求分析 (3) 二、概要设计 (4) 三、详细设计 (6) 四、测试与分析 (7) 五、总结 (7)

六、附录:源程序清单 (8) 一、需求分析 1.1问题描述 汉诺塔(又称河内塔)问题是印度的一个古老的传说。开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。 这是一个著名的问题,几乎所有的教材上都有这个问题。由于条件是一次只能移动一个盘,且不允许大盘放在小盘上面,所以64个盘的移动次数是:

18,446,744,073,709,551,615 这是一个天文数字,若每一微秒可能计算(并不输出)一次移动,那么也需要几乎一百万年。我们仅能找出问题的解决方法并解决较小N值时的汉诺塔,但很难用计算机解决64层的汉诺塔。 后来,这个传说就演变为汉诺塔游戏: 1.有三根杆子A,B,C。A杆上有若干圆盘 2.每次移动一块圆盘,小的只能叠在大的上面 3.把所有圆盘从A杆全部移到C杆上 经过研究发现,汉诺塔的破解很简单,就是按照移动规则向一个方向移动圆盘:如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C 此外,汉诺塔问题也是程序设计中的经典递归问题。 将n个盘子从a座移动到c座可以分解为以下3个步骤: (1)将a上n-1个盘借助c座先移到b座上。 (2)把a座剩下的一个盘移到c座上。 (3)将n-1个盘从c座借助于a座移到c座上。 1.2基本要求 (1)输入的形式和输入值的范围: 输入圆盘的数量,类型为整型,大于零。 (2)输出的形式: 运行结果为用字母表示移动盘子的方案,而并非是真正移动盘子。 (3) 程序所能达到的功能; 输入圆盘数量为定值时的移盘方案。帮助我们更清晰的理解汉诺塔问题,及递归调用的应用。 二、概要设计 分析问题,找出移动圆盘的正确算法。 将n个盘子从a座移动到c座可以分解为以下3个步骤: (1)将a上n-1个盘借助c座先移到b座上。 (2)把a座剩下的一个盘移到c座上。 (3)将n-1个盘从c座借助于a座移到c座上。

汉诺塔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();

12.实验心理学 实验报告 河内塔

河内塔 XXX 应用心理学X班 摘要本实验主要通过被试对河内塔游戏的问题解决的过程,记录问题解决的时间,以及圆盘的移动数量,分析被试所用的思维策略,思考在实验过程中遇到的问题,从而找出解决河内塔的最优方法。一般情况下,被试第一一次参与实验的时间比较长,若成功之后一遍一遍做,时间会慢慢缩短。分析可得最好的策略应当是模式策略。实验存在练习效应和疲劳效应,且极易受环境影响。 关键词河内塔问题循环子目标知觉策略模式策略机械记忆策略 1.引言 河内塔问题是问题解决研究中的经典实验。给出柱子1、2、3。在柱1上,有一系列圆盘,自上而下圆盘的大小是递增的,构成金字塔状。要求被试将柱1的所有圆盘移到柱3上去,且最终在柱3上仍构成金字塔排列,规则是每次只能移动一个圆盘,且大盘不可压在小盘之上,可以利用圆柱2。完成河内塔作业的最少移动次数为2的n次方减1,其中n为圆盘的数目。 解决河内塔问题有以下四种常用策略,分别为循环子目标,知觉

策略,模式策略,机械记忆策略 循环子目标思路是要把最大的金字塔移到柱3,就要先把次大的金字塔移到柱2;而要把次大的金字塔移到柱2, 就要先把比它小一层的金字塔移到柱3。依次类推,直到只需要移动最上面的盘为止。这种策略类似计算机的递归,它是内部指导的策略,被试不必看具体刺激,只是把内部目标记在脑中,然后-步步循环执行,直到解决问题。知觉策略:这种策略是刺激指导的策略,根据所看到的情景与目标的关系,排除当前最大的障碍,从而一步步达到目标。 模式策略:也是内部指导的策略,但不涉及目标,而是按-定规则来采取行动。解决河内塔的通用规则是,当圆盘的总数为奇数时,最小的圆盘按1->3->2->1->3->2的顺序移动;当总数为偶数时,按1->2->3->1- >2- >3的顺序移动。 机械记忆策略是将做对的一系列步骤死记硬背下来,但无法创新,不可迁移。 2 对象与方法 2.1 被试 教师教育学院应用心理学班2班同学1名,矫正视力正常,色觉正常。 2.2 仪器 实验仪器为计算机,PsyKey实验平台 2.3 实验材料

java,汉诺塔,课程设计,心得体会

java,汉诺塔,课程设计,心得体会 篇一:基于JAVA汉诺塔游戏设计与实现 基于JAVA汉诺塔游戏设计与实现 院系:计算机与电子系 专业班:计算机应用技术0902班 姓名:高亚 学号:XX2911057 指导教师:彭文艺 XX 年6月 基于JAVA汉诺塔游戏设计与实现 JAVA Tower of Hanoi-based Game Design and Implementation 摘要 Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE, JavaEE, JavaME)的总称。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。 随着时代的不断发展进步,计算机已经融入我们的日

常生活。很多时候,很多的问题想通过人的手来亲自解决已变得十分困难了,这时我们就要运用计算机来帮我们解决这些复杂的问题,汉诺塔问题就是这类较复杂的问题。 此次,我们通过Eclipse软件来解决汉诺塔问题。程序运行后会出现一个界面,界面上有各种操作提示,按照提示进行各种操作后会得到汉诺塔游戏的运行过程及结果。 关键词: Java 汉诺塔 Eclipse Abstract Java is a cross-platform application software can write object-oriented programming language by Sun Microsystems, Inc. in May 1995 launch of the Java programming language and the Java platform (namely JavaSE, JavaEE, of JavaME) the general excellent versatility, efficiency, platform portability, and security of Java technology, widely used in personal PC, the data center, game consoles, scientific supercomputers, mobile phones and the Internet, while the world's largest developer of professional community. Global cloud computing and mobile Internet industry environment, Java has significant advantages and broad prospects. With the continual development and progress, the

人工智能 实验三 汉诺塔的深度有界搜索求解

< 人工智能 > 实验报告 3 一、实验目的: 掌握汉诺塔的深度有界搜索求解算法的基本思想。 二、实验要求: 用C语言实现汉诺塔的深度有界搜索求解 三、实验语言环境: C语言 四、设计思路: 含有深度界限的深度优先搜索算法如下: (1) 把起始节点S放到未扩展节点OPEN表中。如果此节点为一目标节点,则得到一个解。 (2) 如果OPEN为一空表,则失败退出。 (3) 把第一个节点(节点n)从OPEN表移到CLOSED表。 (4) 如果节点n的深度等于最大深度,则转向(2)。 (5) 扩展节点n,产生其全部后裔,并把它们放入OPEN表的前头。如果没有后裔,则转向(2)。 (6) 如果后继节点中有任一个为目标节点,则求得一个解,成功退出;否则,转向(2)。 五、实验代码: #include #include typedef struct node { long map;

long floor; //记录第几层 } node; node queue[362880 / 2 + 1]; //奇偶各一半 long tail, head; long hash[362880 / 32 + 1]; int main() { void Solve(); while (scanf("%ld", &queue[0].map) && queue[0].map) { memset(hash, 0, sizeof(hash)); queue[0].floor = 1; //(根节点)第一层 tail = head = 0; Solve(); printf("max_floor == %d\n", queue[head].floor); printf("total node == %d\n", head + 1); printf("total node in theory [%d]\n", 362880 / 2); } return 0; } void Solve() { node e; long i, map[9], space; long Compress(long *); int V isited(long *); void swap(long &, long &); while (tail <= head) { e = queue[tail++]; for (i=8; i>=0; i--) { map[i] = e.map % 10; if (map[i] == 0) { space = i; } e.map /= 10; } V isited(map); //根节点要置为访问过 if (space >= 3) { //can up swap(map[space - 3], map[space]); if (!Visited(map)) { queue[++head].map = Compress(map); queue[head].floor = queue[tail - 1].floor + 1;

c语言课程设计--汉诺塔

课程设计报告 课程设计名称:C语言课程设计 课程设计题目:汉诺塔问题求解演示 院(系):计算机学院 专业:计算机科学与技术 班级: 学号: 姓名: 指导教师: 完成时间:2010年3月18日

沈阳航空航天大学课程设计报告 目录 第1章需求分析 (3) 1.1 课程设计的题目及要求 (3) 1.2 总体分析 (3) 第2章系统设计 (4) 2.1 主要函数和函数功能描述 (4) 2.2 功能模块图 (4) 第3章详细设计 (5) 3.1主函数流程图 (5) 3.2各功能模块具体流程图 (6) 第4章调试分析 (10) 4.1.调试初期 (10) 4.2.调试中期 (10) 4.3.调试后期 (10) 参考文献 (11) 附录 (12)

第1章需求分析 1.1 课程设计的题目及要求 题目:汉诺塔问题求解演示 内容: 在屏幕上绘出三根针,其中一根针上放着N个从大到小的盘子。要求将这些盘子从这根针经过一个过渡的针移到另外一根针上,移动的过程中大盘子不能压在小盘子上面,且一次只能移动一个盘子。要求形象直观地演示盘子移动的方案和过程。 要求: 1)独立完成系统的设计,编码和调试。 2)系统利用C语言实现。 3)安照课程设计规范书写课程设计报告。 4)熟练掌握基本的调试方法,并将程序调试通过 1.2总体分析 本题目需要使用C语言绘制图形,所以需要turbo C,需要绘图函数,而汉诺塔的函数属于经典的函数,在书本上都学习过,所以这个题目的难点在于需要绘制汉诺塔图形。攻克这一点其他的问题都迎刃而解。但是我个人以前也没有学过一些关于turboC 方面的知识。所以我将重点放在了对#include下的一系列绘图函数的研究与应用,对屏幕上的图像坐标分析是一个难点。其中用到了graphics.h头文件中的bar, outtextxy, setfillstyle,closegraph函数。进行了画图(利用bar函数进行画框的操作),填充颜色(利用setfillstyle函数填充白色和黑色,以分辨图形与图形背景),在特定位置输出特定字符等操作(利用outtextxy函数)。

汉诺塔课程设计

汉诺塔课程设计 一、教学内容: 1、了解汉诺塔的历史。 2、讲解汉诺塔的游戏规则。 二、课程设计目的: 1、让伙伴们了解汉诺塔的历史,勾起孩子们的学习兴趣,让伙伴们更加热爱数学。 2、在掌握汉诺塔玩法的基础上,锻炼伙伴们的观察力,变通里,和右脑开发。 3、增强伙伴们的空间想象能力和动手能力。 4、让伙伴们体会到数学的神奇,从而对数学产生更加浓厚的兴趣。 三、培养技能:观察力、想象力、变通里、右脑开发。 四、所需工具:汉诺塔、记号笔。 五、教学流程概述: 第一节课:1、讲一个关于汉诺塔的故事。2、带领伙伴们一起观察和了解汉诺塔的游戏规则。(以三盘为例说明)(30分钟) 第二节课:汉诺塔4盘的移法。(30分钟) 第三节课:汉诺塔5盘的移法。(30分钟) 第四节课: 汉诺塔月底考核。(30分钟) 六、教学流程详细解读: 第一节课:让伙伴们了解汉诺塔的历史,勾起孩子们的学习 兴趣,让伙伴们更加热爱数学。 1、讲关于汉诺塔的故事: 在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄 铜板上插着三根宝石针。印度教的主神梵天在创造世界的时 候,在其中一根针上从下到上地穿好了由大到小的64片金 片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在 按照下面的法则移动这些金片:一次只移动一片,不管在哪 根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移

、告诉伙伴们游戏规则: 以三个环为例说明: (一)先让伙伴们自己观察有几个柱子,有几个盘,并且盘是怎么排列的? 答:有三根相邻的柱子,第一根柱子上从下到上放着3个不同大小的圆盘,并且顺序是由大到小依次叠放。 (二)分别为这3个相邻的柱子编号A柱、B柱、C柱;在为这3个圆盘编号盘1、盘2、盘3。 让伙伴们自己动脑想想:如何要把A柱上的3个盘子一个一个移动到C柱上,并且每次移动同一根柱子上都必须保持大点的盘子在下,小点的盘子在上。最后也要使移动到C 柱的圆盘从下到上按照盘3,2,1金字塔的形状排列。 (三)带领伙伴们一起动手操作: (1)、盘1移动到C柱。 (2)、盘2移动到B柱。 (3)、盘1在移动到B柱上,这时盘1在盘2上。 (4)、盘3移动到C柱上。 (5)、再将盘1移动到A柱,这时B柱就只剩盘2。 (6)、将盘2移动到C柱,在盘3上边。 (7)、再将盘1移动到C柱,这时就成功了。 (四)鼓励伙伴们再来一次,按照刚才的移动方法 将C柱的圆盘移动到A柱。 (五)等所有伙伴都移动成功都移动成功后,引导伙伴们仔细思考,看看各位伙伴在移动的过程中有发现什么规律和技巧没有? 带领伙伴再来熟悉一遍: 第一步:盘1移动到C柱;第二步:盘2移动到B柱;......第四步:盘3移动到C柱上......

汉诺塔 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);

12-C程序设计实验(十二)模版

计算机程序设计基础实验报告 实验十二:实验名称函数(二) 实验地点机房 姓名张三专业班级学号 2 日期 【实验目的】 (1)掌握函数的嵌套调用的方法 (2)掌握函数的递归调用的方法 (3)掌握全局变量和局部变量的概念和用法 【实验要求】 (1)熟练掌握函数的嵌套调用的方法 (2)熟练掌握函数的递归调用的方法 【实验环境】 (1) Microsoft XP操作系统 (2) Microsoft VC++ 6.0 【实验内容】 1.极值问题 题目描述:编写一个函数,其功能是求给定数组中的最小值与最大值的元素。 输入:第一行是测试数据的组数,第二行是数组的大小(n<=10)和数组元素输出:最大值和最小值 样例输入: 2 10 10 15 21 54 87 15 15 12 45 32 5 1 2 3 9 10 样例输出: 87 10 10 1 2.渊子赛马 题目描述: 赛马是一古老的游戏,古代战国时期就有田忌赛马。现在渊子也来赛一赛马。假设每匹马都有恒定的速度,所以速度大的马一定比速度小的马先到终点(没有

意外!!)。不允许出现平局。最后谁赢的场数多于一半(不包括一半),谁就是赢家(可能没有赢家)。渊子有N(1≤N≤1000)匹马参加比赛。对手的马的数量与渊子马的数量一样,并且知道所有的马的速度。聪明的你编写一个函数,来预测一下这场世纪之战的结果,看看渊子能否赢得比赛。 输入: 输入有多组测试数据。每组测试数据包括3行: 第一行输入N(1≤N≤1000)。表示马的数量。第二行有N个整型数字,即渊子的N匹马的速度。第三行有N个整型数字,即对手的N匹马的速度。当N为0时退出。 输出: 若通过聪明的你精心安排,如果渊子能赢得比赛,那么输出“YES”。否则输出“NO”。 样例输入: 5 2 3 3 4 5 1 2 3 4 5 4 2 2 1 2 2 2 3 1 样例输出: YES NO 提示:参见P160 例7.9 “按值传递参数” 3.进制转换 题目描述:请你用函数递归,输入一个十进制数整数N,将它转换成R进制数输出。 输入: 输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R (2<=R<=16, R<>10)。输入以文件结束符结束。 输出:

汉诺塔课程设计

攀枝花学院课程设计 题目:汉诺塔演示程序设计院(系): 年级专业: 姓名: 学号: 指导教师: 二〇〇九年十二月十四日 攀枝花学院教务处制

攀枝花学院本科学生课程设计任务书 注:任务书由指导教师填写。

课程设计(论文)指导教师成绩评定表

摘要 汉诺塔(又称河内塔)问题是一个古典的数学问题,是一个用递归方法解题的典型例子。问题是这样的:开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。 利用计算机图形学进行汉诺塔演示程序设计,是利用C语言绘图函数实现汉诺塔的递归算法图形界面演示过程。通过C语言实现图形学的绘图,程序控制,以及区域填充,并根据汉诺塔的算法原理实现大小不同的盘子移动的全过程演示。 关键词汉诺塔,变换矩阵,种子填充算法,递归调用

目录 摘要 .......................................................................................................................................... I 1 需求分析 (1) 1.1 需求概述 (1) 1.2 需求环境 (1) 1.3 功能描述 (2) 2 概要设计 (3) 2.1 程序功能模块 (3) 2.2 程序流程图 (3) 2.3 数据结构的设计 (4) 3 详细设计 (5) 3.1 程序初始化 (5) 3.1.1 代码功能 (5) 3.1.2 功能实现代码 (5) 3.2 盘块的移动过程 (5) 3.2.1代码功能 (5) 3.2.2 功能实现代码 (5) 3.3 递归函数 (6) 3.3.1 流程图 (6) 3.3.2 功能实现代码 (7) 4 测试与运行 (8) 结束语 (9) 参考文献 (10)

汉诺塔程序设计报告

数据结构 学院:信息学院 班级:计科高职13-2 姓名:曲承玉 学号:201303014044

汉诺塔程序设计报告 一、题目 汉诺塔(Towers of Hanoi)问题 二、设计要求 1、在窗口中画出初始时塔和碟子的状态。 2、可以以自动或手动两种方式搬移碟子。 3、自动搬移可以通过定时器或多线程的方法,每一次移动的时间间隔可以自定,以人眼观察比较舒服为宜,每一次的移动过程如能实现动画最好。 4、定义塔的描述类和碟子的描述类。 5、在程序中,碟子的数目及每次移动的时间间隔可以通过对话框设置(也应该有默认值)。 6、支持暂停功和继续的功能(在自动搬移过程中可以暂停,并继续)。 7、暂停后,可以将当前的状态保存(碟子和塔的组合关系)。 8、可以从7中保存的文件中读出某个状态,并继续移动。 三、问题分析 1、已知有三个塔(1、 2、3)和n个从大到小的金碟子,初始状态时n个碟子按从大到小的次序从塔1的底部堆放至顶部。 2、要求把碟子都移动到塔2(按从大到小的次序从塔2的底部堆放至顶部)。 3、每次移动一个碟子。

4、任何时候、任何一个塔上都不能把大碟子放到小碟子的上面。 5、可以借助塔3。(图1-1) 图1-1 首先考虑a杆下面的盘子而非杆上最上面的盘子,于是任务变成了: 1、将上面的63个盘子移到b杆上; 2、将a杆上剩下的盘子移到c杆上; 3、将b杆上的全部盘子移到c杆上。 将这个过程继续下去,就是要先完成移动63个盘子、62个盘子、61个盘子....1个盘的工作。 四、算法选择 汉诺塔程序设计算法的实质就是递归递归思想的运用。现将其算法简述如下: 为了更清楚地描述算法,可以定义一个函数hanoi(n,a,b,c)。该函数的功能是:将n个盘子从塔a上借助塔b移动到塔c上。这样移动n 个盘子的工作就可以按照以下过程进行: 1) hanoi(n-1,a,c,b);//将n-1个金盘由a借助c移到b 2) 将最下面的金盘从a移动到c上;

数据结构实验报告汉诺塔

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

一、目的与要求 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:

汉诺塔非递归算法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)

汉诺塔课程设计

学 号: 200840420149 课 程 设 计 题 目 汉诺塔 教 学 院 计算机学院 专 业 计算机 班 级 网络技术 姓 名 指导教师 2010 年 12 月 17 日

课程设计任务书 2009 ~2010 学年第一学期 学生姓名:专业班级:网络技术 指导教师:工作部门:计算机学院 一、课程设计题目 汉诺威塔 二、课程设计内容(含技术指标) 1.在移动盘子的每一步骤,形象直观地显示各针上的盘子。 2.考虑到学“VC 语言”课程的学生同时学习了“数据结构”课程,所以用灵活的数据结构解决汉诺威塔问题,灵活的处理数据结构中的经典问题。 3.使用VC++,因用面向对象的方法去处理数据结构已经是当今的潮流。 三、进度安排 1. 初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数; 2. 完成最低要求:实现5层汉诺威塔的调整过程; 3.进一步要求:直至实现n=9时的情况。 四、基本要求 1.界面友好,函数功能要划分好 2.总体设计应画流程图 3.程序要加必要的注释 4.要提供程序测试方案 5.程序一定要经得起测试,宁可功能少一些,也要能运行起来。 教研室主任签名: 2010年12 月 17 日

目录 1、概述 (3) 2、设计目的 (4) 3、问题分析 (4) 4、逻辑设计 (5) 5、流程图 (5) 6、程序代码: (6) 7、程序调试与测试 (9) 8、结果分析 (12) 9、总结 (13) 一、概述 数据结构是计算机学科非常重要的一门专业基础理论课程,要想编写针对非数值计算问题的高质量程序,就必须要熟练的掌握这门课程设计的知识。另外,他与计算机其他课程都有密切联系,具有独特的承上启下的重要位置。拥有《数据结构》这门课程的知识准备,对于学习计算机专业的其他课程,如操作系统、数据库管理系统、软件工程的都是有益的。

汉诺塔问题的三种实现

// 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

汉诺塔问题

实验二知识表示方法 梵塔问题实验 1.实验目的 (1)了解知识表示相关技术; (2)掌握问题规约法或者状态空间法的分析方法。 2.实验内容(2个实验内容可以选择1个实现) (1)梵塔问题实验。熟悉和掌握问题规约法的原理、实质和规约过程;理解规约图的表示方法; (2)状态空间法实验。从前有一条河,河的左岸有m个传教士、m个野人和一艘最多可乘n人的小船。约定左岸,右岸和船上或者没有传教士,或者野人数量少于传教士,否则野人会把传教士吃掉。搜索一条可使所有的野人和传教士安全渡到右岸的方案。 3.实验报告要求 (1)简述实验原理及方法,并请给出程序设计流程图。 我们可以这样分析: (1)第一个和尚命令第二个和尚将63个盘子从A座移动到B座; (2)自己将底下最大的盘子从A移动到C; (3)再命令第二个和尚将63个盘子从B座移动到C;(4)第二个和尚命令第三个和尚重复(1)(2)(3);以此类推便可以实现。这明显是个递归的算法科技解决的问

题。 (2)源程序清单: #include #include using namespace std; void main() { void hanoi(int n,char x,char y,char z);

int n; printf("input the number of diskes\n"); scanf("%d",&n); hanoi(n,'A','B','C'); } void hanoi(int n,char p1,char p2,char p3) { if(1==n) cout<<"盘子从"<

C语言程序设计 入门源代码代码集合

#include <> void print_star(void) { printf("*****************\n"); } void print_welcome(void) { printf("C language,welcome!\n"); } void main() { print_star(); print_welcome(); print_star(); getchar(); } 演示2 #include "" int sum(int i,int j) { return(i + j); } void main() { int n1,n2; printf("input 2 numbers:\n"); scanf("%d%d",&n1,&n2); printf("the sum = %d\n",sum(n1,n2)); getchar(); } 演示3 #include "" int maxnum(int,int,int); main() { int a,b,c; printf("Please enter 3 numbers:\n"); scanf("%d,%d,%d",&a,&b,&c); printf("Maxnum is %d\n",maxnum(a,b,c)); return 0;

} int maxnum(int x,int y,int z) { int max=x; if(y>max) max = y; if(z>max) max = z; return max; } 演示4 #include <> int s1(int n) { int j,s; s=0; for(j=1;j<=n;j++) s=s+j; return s; } int sum(int n) { int i,s=0; for(i=1;i<=n;i++) s=s+s1(i); return s; } void main() { int n; printf("n:"); scanf("%d",&n); printf("s=%d\n",sum(n)); } 演示5 #include <>

C语言程序设计-入门源代码代码集合

演示1 #include void print_star(void) { printf("*****************\n"); } void print_welcome(void) { printf("C language,welcome!\n"); } void main() { print_star(); print_welcome(); print_star(); getchar(); } 演示2 #include "stdio.h" int sum(int i,int j) { return(i + j); } void main() { int n1,n2; printf("input 2 numbers:\n"); scanf("%d%d",&n1,&n2); printf("the sum = %d\n",sum(n1,n2)); getchar(); } 演示3 #include "stdio.h" int maxnum(int,int,int); main() { int a,b,c; printf("Please enter 3 numbers:\n"); scanf("%d,%d,%d",&a,&b,&c); printf("Maxnum is %d\n",maxnum(a,b,c));

return 0; } int maxnum(int x,int y,int z) { int max=x; if(y>max) max = y; if(z>max) max = z; return max; } 演示4 #include int s1(int n) { int j,s; s=0; for(j=1;j<=n;j++) s=s+j; return s; } int sum(int n) { int i,s=0; for(i=1;i<=n;i++) s=s+s1(i); return s; } void main() { int n; printf("n:"); scanf("%d",&n); printf("s=%d\n",sum(n)); } 演示5

相关文档
最新文档