上机二 汉诺塔.doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
上机二 汉诺塔

上机二 汉诺塔问题的实现及其优化 问题描述: 假设有三个分别命名为A、B、C的塔座,在塔座B上有n个直径大小各不相同、从小到大编号为1、2…,n的圆盘。现要求将塔座B上的n个圆盘移至塔座A上并按同样顺序叠放,当移动圆盘时应遵循下面规则: 每次只能移动一个圆盘; 圆盘可以放在A、B和C中的任一个上面; 任何时刻都不能将一个较大的圆盘压在较小的圆盘上。 算法思路: 为便于理解,先分析将B座上的三个盘子移动到A座上的过程如下: B→A B→C A→C (B上的两个盘子移动到C上) B→A (B上的一个盘子移动到A上) C→B C→A B→A (C上的两个盘子移动到A上) 工经历7步。由此可推出:移动n个盘子要经历2^n-1步。如移动4个盘子要经历15步。 由上面分析可知:将n个盘子从B座移动到A座可以分解为以下3个步骤: 将B上n-1个盘借助A座先移到C座上 将B座上剩下的一个盘移动到A座上 将n-1个盘从C座借助于B座移动到A坐上 上边第一步和第三步都是吧n-1个盘从一个座移动到另一个座上,采取的办法是一样的,只是座的名字不同,为使之一般化,可以表示为: 将“one”座上n-1个盘移到:“two”座,对应关系是第一步one对B,two对C,three对A。第三步one对C,two对A,three对B。 因此,可以把上边3个步骤分成两类操作: 将n-1个盘从一个座移到另一个座上 将1个盘子从一个座上移到另一个座上 编写程序: 分别用两个函数实现以上的两类操作,用hanoi函数实现上面第1类操作,用move函数实现上面第2类操作,函数调用hanoi(你,one,two,three)表示将n个盘子从“one”座移到“three”座的过程。函数调用move(x,y)表示将1个盘子从x座移到y座的过程。x,y是代表A,B,C座之一,根据每次不同情况分别取A,B,C代入 #includestdio.h #includemath.h #includetime.h void do_something() { for(int i=0;i100000;i++) for(int j=0;j10000;j++) ; void hanoi(int n,char one,char two, char three);/*对hanoi函数的声明*/ int m; int c; printf(input the number of diskes); scanf(%d,m); printf(The step to moveing %d diskes:\n\n,m); hanoi(m,B,C,A); c= pow(2,m) -1; /*输出移动总次数*/ printf(\n移动的总次数为 : %d \n,c); } void hanoi(int n, char one,char two,char three) /*定义hanoi函数*/ /*将n个盘从one座借助two座,移到three座*/ { void move(char x,char y); /*对move函数的声明*/ if(n==1) move(one,three); else { hanoi(n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three); } } void move(char x,char y) /*定义move函数*/ { printf(%c--%c\n,x,y);; } int main(int arg,char ** argv) /*计算程序运行时间*/ { clock_t start=clock(); do_something(); clock_t end=clock(); float time=(float)(end-start)/CLOCKS_PER_SEC; printf(程序运行总时间 : %f\n,time); return 0; } 测试数据: 结论分析 在本程序中move函数并未真正移动盘子,而只是输出移动的方案(从哪一个座移动到哪一个座)。 计算本程序的运行时间是指从打开该

文档评论(0)

asd522513656 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档