标题:Hanoi塔问题
只看楼主
zhangtian202
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2007-11-14
 问题点数:0 回复次数:12 
Hanoi塔问题

Description
Hanoi塔问题是每个新一代的的计算机科学家必须掌握的最著名的经典问题之一。传说在遥远的东方有一座庙,僧侣们尝试把一叠金盘从一根木桩上,从下到上尺寸逐步缩小。僧侣们尝试着按照一次只能移动一个金盘并且大的金盘永远不能放在小的金盘上面的规定,将这叠金盘移动到另外一个木桩上。总共有三个木桩,一个用于暂放金盘。按照推测,僧侣们完成他们的工作之时,正是地球毁灭之日。若真是这样,我们可不愿意助他们一臂之力了。
让我们假设僧侣们想把盘子从桩1移到桩3.我们希望开发一个算法,显示僧侣从木桩到木桩移动盘子的序列。

如果使用传统的方法来处理这个问题,会很快发现我们陷入到这堆盘子的管理之中而无法自拔。这个问题很棘手,似乎没有什么希望解决。然而,用递归的方法来处理这个问题,解决思路就很简单。移动n个盘子可以看成移动n-1的盘子(因此是递归问题),如下所示:

a)把n-1个盘子从桩1移到桩2,把桩3作为临时存放点。

b)把最后一个盘子(最大的)从桩1移到桩3。

c)把n-1个盘子从桩2移到桩子3,把桩1作为临时存放点。

当最后一次任务只有n=1个盘子要移动时(即基本情况),整个过程就结束了。这使值需要轻松地把盘子移过去就可以了,不再需要临时存放点。编写一个程序解决Hanoi塔问题。递归函数使用四个参数:

a)准备移动的盘子数

b)最初放置这些盘子的木桩

c)最后放置这些盘子的木桩

d)作为临时存放点的桩

程序应该打印出将这些盘子从起始桩和移动到目的桩所采取的准确步骤。例如,把三个盘子从桩1移动到桩3,程序应该打印出如下的移动序列:

1 -> 3 (表示把一个盘子从桩1移到桩3)

1 -> 2

3 -> 2

1 -> 3

2 -> 1

2 -> 3

1 -> 3

Input
第一行1个整数t,表示有t组数据。以下t行,每行1个整数n,表示最初桩1有n个盘子。
Output
对于每组输入数据,打印一系列移动序列,每行打印一次移动操作,最后一行打印移动的次数。
Sample Input
2
2
3
Sample Output
1 -> 2
1 -> 3
2 -> 3
Total Steps: 3
1 -> 3
1 -> 2
3 -> 2
1 -> 3
2 -> 1
2 -> 3
1 -> 3
Total Steps: 7
Hint
输出中冒号后有一空格

搜索更多相关主题的帖子: Hanoi 
2007-11-15 19:43
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
得分:0 
递推

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2007-11-15 19:49
zhangtian202
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2007-11-14
得分:0 
我源代码啊..谢谢了
2007-11-15 19:51
zhangtian202
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2007-11-14
得分:0 
大家谁帮个忙啊..
2007-11-15 20:31
purson
Rank: 1
来 自:天堂
等 级:新手上路
帖 子:25
专家分:0
注 册:2007-9-12
得分:0 

void first(int s,int t);
void second(int d);
void main()
{
int m,n;
......
first(m,n);
1:...
}
int first(int s,int t){
int i;
...
second(i);
2:...
}
int second (int d){
int x,y;
...
}

2007-11-15 20:54
zjhofzj
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-11-14
得分:0 
递归函数使用四个参数:

a)准备移动的盘子数

b)最初放置这些盘子的木桩

c)最后放置这些盘子的木桩

d)作为临时存放点的桩
------------------------------------注意这个
a来控制递归 bcd则有规律变化
2007-11-16 08:12
Tony_bb
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2007-11-16
得分:0 

这种东西 只有一个作用 锻炼的你编程思想 一点实际作用都没有 不要趋之若鹜

2007-11-16 08:53
landayuan
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-10-18
得分:0 
。。谁 写可 个演示程序撒
2007-11-16 09:41
yxnamespace
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-10-30
得分:0 
最好看看 严姐姐的 数据结构 通过栈 来递归
看过之后就明白了
2007-11-17 09:58
yxnamespace
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-10-30
得分:0 
学了很久了 试着写下
Hanoi(n,one,two,three)//move from ONE to THREE withe the help of two
{
if(n==1)
move(one,three);
else
{
Hanoi(n-1,one,three,two);//假设前N-1个移动到帮助盘上,借助栈保存状态等待递归
move(one,three);//留下的那个移动到目的地
Hanoi(n-1,two,one,three);//把剩下的从帮助盘上移到目的地,再次借助栈保存状态等待递归
}

2007-11-17 10:10



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-186276-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.089061 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved