设为首页收藏本站

新微赢技术网

 找回密码
 注册
搜索
热搜: 回贴
查看: 1858|回复: 9
打印 上一主题 下一主题

[求助] "汉诺塔问题“求解

[复制链接]
跳转到指定楼层
1#
发表于 2009-11-3 02:14:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在书上看到的: “汉诺塔问题”:
在寺庙的一根柱子上,从上到下,依次从小到大叠放着N个碟子,现在要将这些碟子移动到另外一根柱子上面去,但是一次只能移动一个碟子,且碟子不能把大的叠放在小的上面。除了原来叠放碟子的柱子A,要移碟子过去的目标柱子B,还有一个可以作中转的柱子C,求移动次序?
书上讲解了一点,说是用 递归,但我不明白具体的操作,逻辑关系?
希望各位高手能帮忙讲解一下,不胜感激!
2#
发表于 2009-11-3 02:14:38 | 只看该作者
A B C
要把N个盘子借助B从A放到C,且保证同样的顺序
分三步走:
1.将A上面N-1个盘子借助C放到B上
2.然后再把A上的最后一个盘子放到C上.
3.最后借助C把B上的N-1个盘子放到A上

现在要解决的是把A上的N-1个盘子借助B放到C上
这个过程和上面的是一样的,只是规模N变小的.
递归过程就出来
回复 支持 反对

使用道具 举报

3#
发表于 2009-11-3 02:14:39 | 只看该作者
这个应该是个动态规划的思想吧?
回复 支持 反对

使用道具 举报

4#
发表于 2009-11-3 02:14:40 | 只看该作者
基础递推:

f(n)=f(n-1)*2+1
f(1)=1
回复 支持 反对

使用道具 举报

5#
发表于 2009-11-3 02:14:41 | 只看该作者
#include <stdio.h>
void move(char x,char y)
{
printf("%c-->%c\n",x,y);
}
void hanoi(int n,char one,char two,char 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 m;
printf("input the unmber of diskes:");
scanf("%d",&m);
printf("the step to moving %3d diskes:\n",m);
hanoi(m,'A','B','C');
}
回复 支持 反对

使用道具 举报

6#
发表于 2009-11-3 02:14:42 | 只看该作者
以下是引用六道在2007-10-22 15:29:07的发言:

#include <stdio.h>
void move(char x,char y)
{
printf("%c-->%c\n",x,y);
}
void hanoi(int n,char one,char two,char 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 m;
printf("input the unmber of diskes:");
scanf("%d",&m);
printf("the step to moving %3d diskes:\n",m);
hanoi(m,'A','B','C');
}
Thank you so much!
回复 支持 反对

使用道具 举报

7#
发表于 2009-11-3 02:14:43 | 只看该作者
以下是引用六道在2007-10-22 15:29:07的发言:
if(n==1) move(one,three);
else
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);

谢谢!
现在我明白这个递归序列了
回复 支持 反对

使用道具 举报

8#
发表于 2009-11-3 02:14:45 | 只看该作者
共同学习,没时间改成C++的,就发了个C的~
回复 支持 反对

使用道具 举报

9#
发表于 2009-11-3 02:14:47 | 只看该作者
我把它改成C++的了:
#include <iostream>
using namespace std;
void move(char x,char y)
{
cout<<x<<"-->"<<y<<endl;
}
void hanoi(int n,char one,char two,char three)
{
if(n==1) move(one,three);
else
{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
int main()
{
int N;
cout<<"input the unmber of diskes:"<<endl;
cin>>N;
cout<<"the step to moving "<<N<<" diskes:"<<endl;
hanoi(N,'A','B','C');
return 0;
}
回复 支持 反对

使用道具 举报

10#
发表于 2009-11-3 02:14:48 | 只看该作者
当时看书上的碟子数量N是64,认为很复杂,头都大了
看来,结果是结果
我要了解的只是推理过程,递归序列
当时虽然看了书上的递归介绍,但是不理解
现在终于明白了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

申请友链|小黑屋|最新主题|手机版|新微赢技术网 ( 苏ICP备08020429号 )  

GMT+8, 2024-11-18 02:36 , Processed in 0.114447 second(s), 9 queries , Gzip On, Memcache On.

Powered by xuexi

© 2001-2013 HaiAn.Com.Cn Inc. 寰耽

快速回复 返回顶部 返回列表