汉诺塔算法以C为中转 把n-1个盘子从a移...

跪求大神啊,跪求吧友们帮助,请帮忙看看这道汉诺塔的题怎么做啊_vb吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:60,708贴子:
跪求大神啊,跪求吧友们帮助,请帮忙看看这道汉诺塔的题怎么做啊收藏
课 程 设 计 任 务 书 本题难度级别:B 实现基本要求代码: 约110行 主要涉及: 控件数组,Sleep函数,递归 一、设计题目:汉诺塔(出题人:王岩) 二、目的与要求 1.目的 培养学生综合利用VB语言进行程序设计的能力,主要是利用VB的图像控件进行界面设计,用VB的鼠标事件进行控件的拖拽处理以及利用数组进行数据处理的能力。 2.基本要求 有A、B、C 根柱子.在A柱上套有大小不等的n个圆盘,大的在下,小的在上,要求把这n个盘子最终从A柱移到C柱。移动过程中可以借助B柱,每次只允许移动一个盘,且移动过程中3根柱上的圆盘始终保持大盘在下、小盘在上。本题目要求编写一个能自动计算移到方法并演示移动过程的“汉诺塔”程序。 3.创新要求 在基本要求达到后,必须进行创新设计,创新点可以自己选择,方向提示如下(也可以自己拟订): ①以动画形式演示盘子从一个柱子移到另一个柱子上的过程; ②保存文件时提示文件名,而不是总以step.txt为文件名。 三、设计方法和基本原理 1.问题描述 1) 若只有一个盘子。则直接从A移到C。 2) 若有一个以上的盘子(设为n个),则考虑三个步骤。 ①笫一步:把最上面的n-1个盘子从柱A搬到柱B,这一步不违反说明的第一条眼制限制(一次只能搬动一个盘子),所有n-1个盘子不能作为一个整体一起搬动.而是符合要求地从一个柱移到另一个柱上。注意尽管最终目标是把盘子从A搬到C。但是可以用相同的箅法把盘子从一个柱移到另一个柱上,只要把源柱和目的柱的名字改变一下即可。4 ②笫二步:将剩下的最大的一个盘子直接从A柱搬到耶个仍然空着的C柱。 ③笫三步:用第一步的方法,再次将B柱上的盘子借助A柱搬到C柱。和第一步一样,这一步实际上是由一序列更小的一次仅搬一个盘的操作组成。 例如,要将A柱上的3个盘子移到C柱上,可分为以下3步: 第1步是将A柱上2个盘子移到B柱上(借助C); 第2步是将A柱上一个盘子移到C柱上; 第3步是将B柱上2个盘子移到C柱上(借助A)。 其中笫1步可以分解为: l 将A上的一个盘子从A移到C; l 将A上的一个盘子从A移到B; l 将C上的一个盘子从C移到B。 其中笫3步可以分解为: l 将B上的一个盘子从B移到A; l 将B上的一个盘子从B移到C; l 将A上的一个盘子从A移到C。 以上综合起来的步骤为:A-C,A-B,C-B,A-C,B-A,B-C,A-C;共23-1=7步。 可以把以上几个步骤分为两类操作: (1) 将n-1个盘子从一个柱移到另一个柱上。这是一个递归的过程。 (2) 将1个盘子从一个柱移到另一个柱上。 —直递归到出口的条件:当盘只有一个的时候。 研究表明汉诺塔依其盘子数的不同,移动的最小次数为2n-1。 2. 问题的解决方案 本程序的界面如图2所示。 图2 (1)盘子的数量可在文本框中直接输人也可通过微调按钮进行加减。改变盘数时,窗口底部立即显示出完成移动这些盘子至少用多少步。 (2)要求盘子移动的速度可以调节,可以通过“速度”滚动条调节; (3)单击“开始”按钮后。A柱上的盘子即按照递归算法的要求借助B柱移动到C柱。单击“停止”按钮,程序停止运行。 (4)在盘子移动的过程中。要求在窗口中显示出总共需要移动的次数, 以及巳经移动了多少次。 四、主要技术问题的描述: (1)“盘子”可以用形状(Shape)控件数组来表示。在程序处理时会更方便一些。A、B、C柱也可用形状控件表示。将其置于盘子后面,A、B、C 柱的位置可在设计时设定好。也可在程序中加以控制。 (2)本程序必须使用递归方法才能模拟出盘子的移动过程。因为过程的调用速度很快,窗口中显示的内容会看不清楚,但是在递归过程中又不能使用Timer控件进行延时处理。所以需要使用API函数Sleep进行延时,例如: Sleep (1000)。 (3)递归调用的程序段参照如下: Private Function Hnt(n As Integer, A As String, B As String, C As String) total_count = total_count + 1 If n & 1 Then Hnt (n - 1), A, C, B List1.AddItem (A) List2.AddItem (C) Hnt (n - 1), B, A, C Else List1.AddItem (A) List2.AddItem (C) End If End Function (4)要移动用listBox控件存放 五、参考资料 ★ Visual Basic 程序设计教程 及 Visual Basic 实验教程 ★ VB6.0程序员指南 ★ VB6.0控件参考手册 ★ VB参考资料中的“文本编辑器.ZIP” ★ MSDN中文版,课程设计网站上提供的其它资料。 六、设计部分的评分标准(本题难度为B级,综合时乘难度系数0.9) 完成基本要求 60-80 创新要求完成任意两项(不包括“其它”) 90 创新要求全部完成,并有自己独创性 100 [注:最后得分是根据本部分得分(占最大比例)以及课程设计期间纪律、设计报告书、答辩情况综合得出]
顶一下,吧友们帮帮我
顶,没有人吗?
没人吗?求帮忙
吧主会帮你....shan tie
怎么代码还要求行数的。。
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或汉诺塔问题
&汉诺塔问题是一个典型的递归程序。递归的算法见上面的实验说明。先判断n是否等于一,若等于则直接将盘子从A移到C否则分三步。第一步,将n-1个盘子从A借助C移到B,第二步,
将最后一个盘子从A移到C,第三步,将B中的n-1个盘子借助A移到C。递归的的算法见源程序代码(1)。
在递归算法的解决中,并不存在栈。只是一个假设的栈,移动盘子。我们用move函数表示栈中盘子的出栈,进栈。
而递归的本质是函数的进栈,出栈。我们可以用对象来表示函数的状态。将递归的函数的三步分别进栈,出栈,
用栈来实现汉诺塔的非递归算法。因为栈的先进后出的特点。所以进栈的顺序应该是hano(n-1, B,A,C); Move(A,C);
hano(n-1; A,C,B);
代码实现见源程序二。
源程序代码
#include&iostream&
void Hanoi(int n, char A, char B,char C)
&&&&&&&&&&&&&
cout&&A&&"-&"&&C&&
&&&&&&&&&&&&&
Hanoi(n-1, A,C, B);
&&&&&&&&&&&&&
cout&&A&&"-&"&&C&&
&&&&&&&&&&&&&
Hanoi(n-1, B, A,C);
&int main()
a='A', b='B',c='C';
Hanoi(4, a,b,c);
#include&iostream&
#include&stack&
class hannofunc
char first, middle,
hannofunc(int cn=0, char a=' ' , char b=' ', char c=' ')
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
~hannofunc()
&&&&&&&&&&&&&
&first=' ';
&&&&&&&&&&&&&
&middle=' ';
&&&&&&&&&&&&&
hannofunc(const& hannofunc & han
&&&&&&&&&&&&&
this-&n=han.n;
&&&&&&&&&&&&&
this-&first=han.
&&&&&&&&&&&&&
this-&middle=han.
&&&&&&&&&&&&&
this-&end=han.
set(int cn, char a , char b, char c)
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
void hanno(int n, char A, char B, char C)
stack&hannofunc& st_han_
hannofunc MA(n,A,B,C);
st_han_fun.push (MA);
hannofunc&
while( st_han_fun.size() & 0 )
top=st_han_fun.top();
&& st_han_fun.pop();
&& if(& top.n
&&&&&&&&&&&&&
&& //将hano(n-1, B,A,C)进栈
&&&&&&&&&&
hannofunc temp( top.n-1, top.middle, top.first, top.end);
&&&&&&&&&&&&&
&& st_han_fun.push (temp);
&&&&&&&&&&
//将Move(A,C)进栈
&&&&&&&&&&&&&
&& temp.set(1,top.first,
top.middle, top.end);
&&&&&&&&&&
st_han_fun.push (temp);
// hano(n-1; A,C,B)进栈
&&&&&&&&&&&&&
&& temp.set( top.n-1, top.first,
top.end, top.middle );
&&&&&&&&&&
st_han_fun.push (temp);
&&&&&&&&&&&&&
&&&cout&&top.first&&"-&"&&top.end&&
int main()
char A='A',B='B',C='C';
hanno(4,A,B,C);
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。当前访客身份:游客 [
当前位置:
发布于 日 22时,
在学习数据结构的过程中,实现书中代码――汉诺塔
代码片段(1)
汉诺塔.cpp&~&416B&&&&
#include&stdio.h&
void move(char x,char y){
printf("%c--&%c\t",x,y);m++;
void hanoi(int n,char x,char y,char z){
if(n==1)move(x,z);
hanoi(n-1,x,z,y);
move(x,z);
hanoi(n-1,y,x,z);
int main(){
char x,y,z;
printf("\n请输入A座上盘子的个数: ");
scanf("%d",&n);
printf("\n移动这n个盘子的步骤为:\n");
hanoi(n,'A','B','C');
printf("\n\n盘子总共移动%d次",m);
开源中国-程序员在线工具:
void hannoi(int n, char a, char b, char c)
if(n &= 0)
/*将n-1个盘子借助C从A移动到B*/
hannoi(n - 1, a, c, b);
/*将第n个盘子从A移到C*/
printf(&把第%d个盘子从%c移动到%c\n&,n, a, c);
/*将 n-1个盘子借助A从B移动到C*/
hannoi(n - 1, b, a, c);
贴个代码一起学习
开源从代码分享开始
javastudent的其他代码当前位置: >
> 汉诺塔讲解#include<stdio.h>voidhannuota(intn,cha
汉诺塔讲解#include<stdio.h>voidhannuota(intn,cha
lwt110 & at
汉诺塔讲解# include &stdio.h&void hannuota(int n, char A, char B, char C){ /* 如果是1个盘子
直接将A柱子上的盘子从A移到c &
先将A柱子上的n-1个盘子借助C移到B
直接将A柱子上的盘子从A移到C
最后将B柱子上的n-1个盘子借助A移动C &
*/ if (1 == n) {
printf(&将编号为%d的盘子直接从%c柱子移到%c柱子.\n\n&, n, A, C); } else {
hannuota(n-1, A, C, B);
printf(&将编号为%d的盘子直接从%c柱子移到%c柱子.\n\n&, n, A, C); &
hannuota(n-1, B, A, C); }}int main(void){ char ch1 = 'A'; char ch2 = 'B'; char ch3 = 'C'; & printf(&请输入要移动盘子的个数: &); scanf(&%d&, &n); hannuota(n, 'A', 'B', 'C'); return 0;}上面那个程序的算法我能看懂,但如果拿个数进去试,都不知道程序的流程了。大家帮忙讲解一下吧,比如输入3,程序的执行流程是怎样的。请详细说哦,要详细哦。
将递归转化为非递归是理解递归的不二法门。  C/C++ code  #include&stdio.h&
#define MAX 100
typedef struct DATA
//flag==1,表示还可以分解,若为0这不能分解
//表示盘子个数
}DATATYPE;
void Hanoi(int n,char x,char y,char z);
int main()
printf(&请输入盘子的个数:&);
scanf(&%d&,&n);
Hanoi(n,'X','Y','Z');
void Hanoi(int n,char x,char y,char z)
DATATYPE stack[MAX];
int x1,y1,z1,m,top=1;
stack[top].num=n;
stack[top].flag=1;
stack[top].x=x;
stack[top].y=y;
stack[top].z=z;
while(top)
if(stack[top].flag==1&&stack[top].num&1)
m=stack[top].
//参数的传递==Hanoi(num,x,y,z);
x1=stack[top].x;
y1=stack[top].y;
z1=stack[top].z;
stack[top].num=m-1;
//将第m-1个盘子经过x从y移到z==Hanoi(m-1,y,x,z)
stack[top].flag=1;
stack[top].x=y1;
stack[top].y=x1;
stack[top].z=z1;
stack[top].num=m;
stack[top].flag=0;
//将第m个盘子从x移到z==Move(m,x,z)
stack[top].x=x1;
stack[top].y=z1;
stack[top].num=m-1;
stack[top].flag=1;
stack[top].x=x1;
//将第m-1个盘子从x经过z移到y==Hanoi(m-1,x,z,y)
stack[top].y=z1;
stack[top].z=y1;
while(top&0&&(stack[top].flag==0||stack[top].num==1))
if(top&0&&stack[top].flag==0)
//将第n个盘子从x移到z
printf(&将第%d个圆盘从塔%c移动到%c\n&,stack[top].num,stack[top].x,stack[top].y);
if(top&0&&stack[top].num==1)
//将第一个盘子从x移到z
printf(&将第%d个圆盘从塔%c移动到%c\n&,stack[top].num,stack[top].x,stack[top].z);
//请输入盘子的个数:3
//将第1个圆盘从塔X移动到Z
//将第2个圆盘从塔X移动到Y
//将第1个圆盘从塔Z移动到Y
//将第3个圆盘从塔X移动到Z
//将第1个圆盘从塔Y移动到X
//将第2个圆盘从塔Y移动到Z
//将第1个圆盘从塔X移动到Z
//Press any key to continuelwt8104 & &
& & (0)(0)
本问题标题:
本问题地址:
温馨提示:本问题已经关闭,不能解答。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&&&湘教QS2-164&&增值电信业务经营许可证湘B2-汉诺塔-中国学网-中国IT综合门户网站
转载 编辑:李强
为了帮助网友解决“汉诺塔”相关的问题,中国学网通过互联网对“汉诺塔”相关的解决方案进行了整理,用户详细问题包括:语言计算机各位有谁明白汉诺塔用计算机语言表示,这个程序是怎么理解的?void&f(int&n,String&x,String&y,String&z){if(n==1)//只有一个盘子{System.out.println(n+":"+x+"--&"+z);}else{f(n-1,x,z,y);//将n-1&&x--&ySystem.out.println(n+":"+x+"--&"+z);f(n-1,y,x,z);//将n-1&&y--&z}},具体解决方案如下:暂时还未收集到解决方案,如您有解决办法请在下面留言回答通过对数据库的索引,我们还为您准备了:问:快啊答:其实汉诺塔只要掌握规律,多少层都是一样的。最重要的是第一块放在哪儿,单数层的汉诺塔一定要放在第三柱,双数层的要放在第二柱。如果你会六层的汉诺塔,(将第一块放在第三柱),将六块都移到第二柱,最后一块移到第三柱,再如前法将上面六块都...===========================================问:快啊答:就是有三个柱子放盘子,将一开始左边的盘子移动到以原来的叠放次序放到最右边,每次只能移动最上面的一个盘,叠放原则是大盘不能在小盘上面的游戏。===========================================问:程序如下: void move(char x,char y){ printf("%c--&%c\n",x,y); } voi...答:你自己去看看吧~~ /s?cl=3&wd=%D2%D7%CB%FE%BD%BB%D2%D7===========================================问:A B C三个杆子,把B杆的4个碟子(底座最大,倒数第二层次之,倒数第三层次之...答:数学归纳法: 一个盘子的话,一次就OK,记A1=1 两个盘子,分三步: 1.将B最上面的一个盘子移到C上,就个就是上面一个盘子的情况,即A1次 2.将B最下面的盘子移到A上,一次就好。 3.将C的所有盘子(1个),移到A上面,即A1次。 也就是A2=2A1+1=3 =...===========================================问:约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左...答:#include int main() { scanf("%d",&n); printf("%d",(1===========================================问:#include &iostream&void Hanoi(int, char, ...答:首先不看代码,理一下思路,汉诺塔解题步骤有三步(设A-&C),先将汉诺塔看成两部分n-1,1(n-1在上面) 第一:将A中的n-1个盘借助C移到B ===&Hanoi(n-1,a,c,b); 第二:将A中的最下面的那一个移到C===&move(a,c); 第三:将B中的盘借助A移到C.===&Ha...===========================================问:我看的是谭浩强写的,那个汉诺塔问题里面的Hanoi 函数感觉好强大,巧妙...答:编程时,脑子里不要去思考递归过程(转来转去,会让人很头疼,一会儿就晕了)。 数列我想你是清楚的,所谓的递归,就是把an变成a(n-1)去处理问题,处理一个通项式是相同的方法,只要给出a1(或者还有a2),这是递归结束的条件。 假设汉诺塔A B C三...===========================================问:我看的是谭浩强写的,那个汉诺塔问题里面的Hanoi 函数感觉好强大,巧妙...答:有A、B、C三根柱子,在A柱子上有m个大小不等的盘子,且A柱子下面的盘子比上面的盘子大。借助B柱子,将A柱子上的盘子移动到C柱子上,移动后C柱子上的盘子从上到下依次增大;在移动中,上面的盘子必须比下面的盘子校===========================================问:有三个塔座标为A,B,C,在塔座A上有n个直径大小各不相同、依小到大编号为...答:# include void hannuota(int n, char A, char B, char C) { /* 如果是1个盘子 直接将A柱子上的盘子从A移到C 否则 先将A柱子上的n-1个盘子借助C移到B 直接将A柱子上的盘子从A移到C 最后将B柱子上的n-1个盘子借助A移到C */ if (1 == n) { printf(...=========================================== 数学归纳法: 一个盘子的话,一次就OK,记A1=1 两个盘子,分三步: 1.将B最上面的一个盘子移到C上,就个就是上面一个盘子的情况,即A1次 2.将B最下面的盘子移到A上,一次...===========================================的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总...===========================================汉诺塔的破解很简单,就是按照移动规则向一个方向移动金片: 如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C 此外,汉诺塔问题也是程序设计中的经典递归问题。...=========================================== 有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,现在把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘...===========================================等到婆罗门完成这项工作,寺庙和婆罗门本身都崩溃了,世界在一声霹雳中也毁灭了。 喜欢玩具或者给孩子买过玩具的朋友,一定知道这个传说。这个传说是关于"汉诺塔"的,我...===========================================汉诺塔是一个迭代问题,我们先假设x层汉诺塔从第一根柱子移动到最后一根柱子(目标柱子)的最快次数是f(x)次 显然f(1)=1 f(2)=3 然后看3层的,我们可以把整个过程分解为三个部...===========================================面对庞大的数字(移动圆片的次数)^64-1),看来,众僧们耗尽毕生精力也不可能完成金片的移动。 后来,这个传说就演变为汉诺塔游戏: 1.有三根杆...===========================================应该没多大关系吧,汉诺塔是有规律的,想当年我玩了很久才发现呢,建议你慢慢玩,研究一下到底是什么规律,这样会很开心的...===========================================应该对你有帮助的!1楼说的好像有问题。汉诺塔是手动,一般需要上下左右方向键就ok了,所以定时器是多余的。如果你的汉诺塔全部是绘制出来的,那么在响应消息WM_KEYDO...===========================================面对庞大的数字(移动圆片的次数)^64-1),看来,众僧们耗尽毕生精力也不可能完成金片的移动。 后来,这个传说就演变为汉诺塔游戏: 1.有三根杆子...===========================================
本文欢迎转载,转载请注明:转载自中国学网: []
用户还关注
可能有帮助

我要回帖

更多关于 汉诺塔算法 的文章

 

随机推荐